kotlin lambda 表达式作为可选参数
Posted
技术标签:
【中文标题】kotlin lambda 表达式作为可选参数【英文标题】:kotlin lambda expressions as optional parameter 【发布时间】: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 表达式
【参考方案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
【讨论】:
以上是关于kotlin lambda 表达式作为可选参数的主要内容,如果未能解决你的问题,请参考以下文章