如何将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表达式,而不是匹配类型的变量。