我发现了一段我不理解的代码。
我正在将JSONArray
转换为List
Kotlin在mapTo
(link)中提供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
答案 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表达式而不是匹配类型的变量。