kotlin lambda表达式作为可选参数

Pra*_*hap 11 lambda android expression kotlin

如何将lambda表达式作为Kotlin语言中的可选参数传递

val max = { a: Int, b: Int ->
  if (a > b)
      a
  else
      b
}
Run Code Online (Sandbox Code Playgroud)

我必须传递上面的东西就像可选参数

Gre*_*pff 12

下面定义了一个接受函数的函数,如果没有提供函数,则指定传递函数的默认值.

fun foobar(fn: (a: Int, b: Int) -> Int = { a: Int, b: Int -> if (a > b) a else b }) {
  println(fn(42, 99))
}
Run Code Online (Sandbox Code Playgroud)

您可以传递自己的功能:

val min = { a: Int, b: Int -> if (a <= b) a else b }
foobar(min)

val max = { a: Int, b: Int -> if (a > b) a else b }
foobar(max)
Run Code Online (Sandbox Code Playgroud)

您可以省略该功能并使用默认值:

foobar()
Run Code Online (Sandbox Code Playgroud)

或者,您可以将标准库maxOf函数称为默认值,而不是编写自己的函数:

fun foobar(fn: (a: Int, b: Int) -> Int = ::maxOf) {
  println(fn(42, 99))
}
Run Code Online (Sandbox Code Playgroud)


gue*_*ter 6

您可以使用max默认功能

fun someDefault(f: (a: Int, b: Int) -> Int = max) {
    f(1, 7)
    // do something
}
Run Code Online (Sandbox Code Playgroud)

或者您也可以定义一个以lambda作为参数的方法,该方法是可选的

fun someOptional(f: ((a: Int, b: Int) -> Int)? = null) {
    f?.invoke(1, 7)
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下(默认和可选),您都可以为通话指定一个lambda,也可以忽略它

fun call() {
    someDefault()
    someDefault { a, b -> a * b}

    someOptional()
    someOptional { a, b -> a * b}
}
Run Code Online (Sandbox Code Playgroud)