Kotlin中的forEach函数声明是这样的:
inline fun ByteArray.forEach(action: (Byte) -> Unit)
(source)
就是说这个函数需要接受一个action参数,所以他的调用写法应该是这样的:
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
在forEach后加一个括号,括号里放参数,但是我又发现还有下面这种特殊的写法:
ints.forEach {
if (it == 0) return@forEach
print(it)
}
非常疑惑,经过查找,原来这是一个Kotlin一个特殊的约定:(https://www.kotlincn.net/docs/reference/lambdas.html)
将 lambda 表达式传给最后一个参数
在 Kotlin 中有一个约定:如果函数的最后一个参数接受函数,那么作为相应参数传入的 lambda 表达式可以放在圆括号之外:
val product = items.fold(1) { acc, e -> acc * e }
如果该 lambda 表达式是调用时唯一的参数,那么圆括号可以完全省略:
run { println("...") }
这种约定虽然可以使编程简洁,但是给不熟悉的人带来了困扰,算是有利有弊吧,但我还是希望这种“约定”少一些,减少一下学习成本:)