【问题标题】:kotlin lambda expressions as optional parameterkotlin lambda 表达式作为可选参数
【发布时间】:2017-12-07 16:00:15
【问题描述】:

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

val max = { a: Int, b: Int ->
  if (a > b)
      a
  else
      b
}

我必须通过上面的东西就像可选参数

【问题讨论】:

  • 你想把这个 lambda 传递给什么?
  • 旁注,JDK 中已经有一个max 函数可用,可以通过Math.max(a, b) 访问,它做同样的事情。
  • 关于你的问题,我不太明白你在问什么——你可以将max 作为普通参数传递给任何采用(Int, Int) -> Int 形式的函数的函数调用。
  • 这里我以 MAX 为例,因为我不能分享我的代码,它应该适用于所有类型的 lambda 表达式

标签: android lambda expression kotlin


【解决方案1】:

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

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

你可以传递你自己的函数:

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)

您可以省略该函数并使用默认值:

foobar()

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

fun foobar(fn: (a: Int, b: Int) -> Int = ::maxOf) {
  println(fn(42, 99))
}

【讨论】:

    【解决方案2】:

    您可以默认使用 max 函数

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

    或者你也可以定义一个带有 lambda 作为参数的方法,这是可选的

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多