如何将lambda表达式放在mapTo调用合法语法之后?
我发现了一段我不明白的代码。
我正在将JSONArray
转换为List
。
Kotlin在stdlib
( 链接 )中提供了函数mapTo
,
mapTo
inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo( destination: C, transform: (T) -> R ): C (source)
将给定的转换函数应用于原始集合的每个元素,并将结果附加到给定的目标。
这个函数有2个参数,可以像这样使用(按预期):
(0..jsonArray.length() - 1).mapTo(targetList, {it -> jsonArray[it].toString()})
但显然这也是有效的语法(不期望):
(0..jsonArray.length()-1).mapTo(targetList) {it -> jsonArray[it].toString()}
正如你所看到的,函数参数在outputList
之后结束,并且lambda表达式刚好放在函数调用的最后。
此外,这是合法的(如预期):
val transformation = {it : Int -> jsonArray[it].toString()} (0..jsonArray.length()-1).mapTo(targetList, transformation)
但这不是(???):
val transformation = {it : Int -> jsonArray[it].toString()} (0..jsonArray.length()-1).mapTo(targetList) transformation
正如文件中所述 :
在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且将一个lambda表达式作为相应的参数传递,则可以在括号外指定它:
lock (lock) { sharedResource.operation() }
高阶函数的另一个例子是map():
fun <T, R> List<T>.map(transform: (T) -> R): List<R> { val result = arrayListOf<R>() for (item in this) result.add(transform(item)) return result }
这个函数可以被调用如下:
val doubled = ints.map { it -> it * 2 }
请注意,如果lambda是该调用的唯一参数,则可以省略调用中的括号。
该文档明确指出,对于上述工作,最后一个参数必须是lambda表达式,而不是匹配类型的变量。