如何将lambda表达式放在mapTo上的参数之后调用合法语法?

时间:2017-03-30 09:15:43

标签: lambda kotlin

我发现了一段我不理解的代码。

我正在将JSONArray转换为List Kotlin在mapTolink)中提供stdlib函数

  

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

1 个答案:

答案 0 :(得分:21)

the documentation中所述:

  

在Kotlin中,有一个约定,如果最后一个参数为a   函数是一个函数,你将一个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表达式而不是匹配类型的变量。