如何将映射函数应用于Kotlin中的数组并更改其值?

Sus*_*ger 6 arrays kotlin

我正在使用此代码。

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,

我的问题是,为什么数组的值不加倍?我在这里想念什么?

zsm*_*b13 7

您总是可以定义自己的扩展来满足您的需求:

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)


use*_*612 5

从文档中,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)