我正在使用此代码。
fun main(args : Array<String>){
val someArray : Array<Int> = arrayOf(3,53,2,521,51,23,512,34,124);
println("Original array is ")
someArray.forEach {print("$it , ")}
someArray.map({num -> num*2})
println("Changed array is ")
println()
someArray.forEach { print("$it , ") }
}
Run Code Online (Sandbox Code Playgroud)
但是地图功能似乎不起作用。这是它打印的内容
原始数组是3,53,2,521,51,23,512,34,124,更改后的数组是
3、53、2、521、51、23、512、34、124,
我的问题是,为什么数组的值不加倍?我在这里想念什么?
您总是可以定义自己的扩展来满足您的需求:
fun <T> Array<T>.mapInPlace(transform: (T) -> T) {
for (i in this.indices) {
this[i] = transform(this[i])
}
}
Run Code Online (Sandbox Code Playgroud)
用法如下所示:
someArray.mapInPlace { num -> num * 2 }
Run Code Online (Sandbox Code Playgroud)
请注意,原始数组有一些特殊的非泛型类,例如IntArray(另请参见此问题),因此您可能应该使用这些类而不是泛型类。当然,您必须分别为每个扩展名定义此扩展名,例如:
fun IntArray.mapInPlace(transform: (Int) -> Int) { ... }
fun DoubleArray.mapInPlace(transform: (Double) -> Double) { ... }
Run Code Online (Sandbox Code Playgroud)
小智 6
另一种方法是使用forEachIndexed代替map. 代替
someArray.map({num -> num*2})
Run Code Online (Sandbox Code Playgroud)
经过
someArray.forEachIndexed{ index, num -> someArray[index] = num * 2 }
Run Code Online (Sandbox Code Playgroud)
从文档中,map不会修改到位的项目,而是返回一个,List其中包含应用于所有项目的映射函数的结果:
返回一个列表,其中包含将给定的转换函数应用于原始数组(或集合或映射,取决于接收者)中的每个元素的结果。
因此,要获得预期的结果,您应该执行以下操作:
val doubled = someArray.map { n -> n * 2}
doubled.forEach { print("$it , ") }
Run Code Online (Sandbox Code Playgroud)
据我所知,没有内置功能可以让您就地映射项目。但是,在您的情况下,您正在处理Array可变数据结构的,因此另一种选择是使用旧式循环来迭代转换其项(您可以将相同的逻辑与MutableList或其他可变数据结构一起使用Iterator以更新值)。像这样:
fun main(args: Array<String>) {
val someArray: Array<Int> = arrayOf(3, 53, 2, 521, 51, 23, 512, 34, 124);
someArray.forEach { print("$it , ") }
println()
for (i in 0 until someArray.size) {
someArray[i] = someArray[i] * 2
}
someArray.forEach { print("$it , ") }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9050 次 |
| 最近记录: |