我发现了一段我不理解的代码.
我正在JSONArray
变成一个List
.
Kotlin提供了mapTo
它的功能stdlib
(链接)
mapTo
Run Code Online (Sandbox Code Playgroud)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()})
Run Code Online (Sandbox Code Playgroud)
但显然这也是有效的语法(不是预期的):
(0..jsonArray.length()-1).mapTo(targetList) {it -> jsonArray[it].toString()}
Run Code Online (Sandbox Code Playgroud)
如您所见,函数参数结束后outputList
,lambda表达式只是放在函数调用的末尾.
此外,这是合法的(如预期):
val transformation = {it : Int -> jsonArray[it].toString()}
(0..jsonArray.length()-1).mapTo(targetList, transformation)
Run Code Online (Sandbox Code Playgroud)
但这不是(???):
val transformation = {it : Int -> jsonArray[it].toString()}
(0..jsonArray.length()-1).mapTo(targetList) transformation
Run Code Online (Sandbox Code Playgroud)
mie*_*sol 22
在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且您将lambda表达式作为相应的参数传递,则可以在括号外指定它:
Run Code Online (Sandbox Code Playgroud)lock (lock) { sharedResource.operation() }
高阶函数的另一个例子是map():
Run Code Online (Sandbox Code Playgroud)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 }
可以按如下方式调用此函数:
Run Code Online (Sandbox Code Playgroud)val doubled = ints.map { it -> it * 2 }
请注意,如果lambda是该调用的唯一参数,则可以完全省略调用中的括号.
文档明确指出,为了使上述工作,最后一个参数必须是lambda表达式而不是匹配类型的变量.
归档时间: |
|
查看次数: |
3541 次 |
最近记录: |