我发现 Kotlin 中的 Lambda 非常混乱,最重要的是“它”。关于“它”,我知道两件事,即
我仍然不明白什么是“它”。
例如,我想对3x3矩阵的每个元素应用模函数。
fun main(){
var result = Array(3) {
IntArray(3) { 3;2;4;6;7;9;12;11;23 }
}
result = Array(3){ IntArray(3) {it%2} }
println(result.joinToString("\n") { it.joinToString(" ") })
}
Run Code Online (Sandbox Code Playgroud)
在这里,我假设“它”采用矩阵的每个元素,这显然不是我的输出情况:
0 1 0
0 1 0
0 1 0
Run Code Online (Sandbox Code Playgroud)
那么你能解释一下“它”是如何工作的,这里发生了什么?实施该计划的正确方法是什么?
你的线路
result = Array(3){ IntArray(3) {it%2} }
Run Code Online (Sandbox Code Playgroud)
对result指向的原始 Array 没有做任何事情。您正在通过调用Array和IntArray 构造函数来创建一组全新的数组对象。
您传递给IntArray 构造函数的 lambda有一个表示数组索引的输入参数,您的 lambda 的返回值将被放入该索引处的数组中。所以在这种情况下it是数组索引,你的 lambda 分别为偶数和奇数索引返回 0 和 1。
您也开始错误地实例化您的数组。您传递给该IntArray构造函数的lambda丢弃了一堆毫无意义的 Int 值,然后为每个项目返回 23。因此,您创建了一个 3x3 矩阵,其中完全填充了数字 23。
创建具有显式值的数组的正确语法是使用arrayOfor intArrayOf。
val result = arrayOf(
intArrayOf(3, 2, 4),
intArrayOf(6, 7, 9),
intArrayOf(12, 11, 23)
)
Run Code Online (Sandbox Code Playgroud)
要修改数组的所有值,您通常以传统方式迭代,而不是使用 lambda:
for (innerArray in result) {
for (i in innerArray.indices)
innerArray[i] = innerArray[i] % 2
}
Run Code Online (Sandbox Code Playgroud)
您可能正在考虑该map函数,它允许您传递一个 lambda 并返回一个新的 List,其中 lambda 函数应用于输入集合的每个元素。或者,在处理数组以外的集合时,您可以使用forEach或onEach迭代它们而无需修改它们。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |