如何在 Kotlin 中将 lambda 链接到结果 lambda?

Ped*_*ges 4 lambda chaining kotlin

...或相当于java.util.Function.andThen()

爪哇语

Function<String, String> add1 = string -> string + "1";
Function<String, String> add2 = string -> string + "2";
Function<String, Strint> add12 = add1.andThen(add2);
Run Code Online (Sandbox Code Playgroud)

add12.apply("")回报"12"

我该如何用 Kotlin 编写它?

val add1 = { string:String -> string + "1" }
val add2 = { string:String -> string + "2" }
val add12 = ?
Run Code Online (Sandbox Code Playgroud)

Sil*_*olo 7

您正在寻找的功能称为函数组合。据我所知,它不是 Kotlin 内置的(希望对此进行更正)。但将其编写为扩展函数非常容易。

infix fun<A, B, C> ((B) -> C).compose(that: (A) -> B): (A) -> C =
  { this(that(it)) }
Run Code Online (Sandbox Code Playgroud)

现在我们可以写

val add1 = { string:String -> string + "1" }
val add2 = { string:String -> string + "2" }

println((add2 compose add1)("3")) // Prints "312"
Run Code Online (Sandbox Code Playgroud)

我写作compose时使用从右到左的组合,更符合数学函数的工作方式。

  • 这已经有五年的历史了,但看起来 Kotlin 标准库的原始理念是,它对于某些编程风格来说过于具体,无法包含在内:https://discuss.kotlinlang.org/t/function-composition-in-standard -图书馆/1683 (2认同)
  • 可能这是因为我们在 Kotlin 中传递的函数引用不多。这感觉很不自然,至少对我来说是这样。`doSomething { add2(add1(it)) }` 比 `doSomething(::add2 compose ::add1)` 更短,可读性更强,并且操作顺序非常清晰。但也许我错过了 lambda 不够充分的好例子。 (2认同)