在Kotlin中如何将map函数应用于数组并改变其值?

16

我正在使用这段代码。

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 , ") }
}

但是,map函数似乎不起作用。以下是它的输出:

原始数组为 3,53,2,521,51,23,512,34,124,更改后的数组为

3,53,2,521,51,23,512,34,124,

我的问题是为什么数组没有将其元素的值加倍?我在这里漏了什么?


你需要将这个数组赋值给另一个数组。 - nayem
val someArray 改为 var someArray。然后执行 someArray = someArray.map({num -> num*2}) - nayem
重新赋值有什么问题吗? - nayem
我明白你的意思。我的问题是,我能否使用单个函数来完成这个操作,比如 someArray.someFunction({num -> num*2}),它将修改元素? - Dishonered
好的,感谢你的帮助。 - Dishonered
显示剩余4条评论
4个回答

14

您可以定义自己的扩展来实现所需功能:

fun <T> Array<T>.mapInPlace(transform: (T) -> T) {
    for (i in this.indices) {
        this[i] = transform(this[i])
    }
}

使用方法如下:

someArray.mapInPlace { num -> num * 2 }

请注意,针对原始数组有特殊的非通用类,例如IntArray(也可以参见这个问题),因此您应该使用它们而不是通用类。当然,这样做就必须为每个数组类型单独定义扩展,例如:
fun IntArray.mapInPlace(transform: (Int) -> Int) { ... }
fun DoubleArray.mapInPlace(transform: (Double) -> Double) { ... }

10

根据文档,map 并未直接修改原有项,而是返回一个包含将映射函数应用到所有项的结果的 List

返回一个列表,其中包含将给定转换函数应用于原始数组[或收集或映射,具体取决于接收器]中的每个元素的结果。

因此,为了获得预期的结果,您应该执行类似以下的操作:

val doubled = someArray.map { n -> n * 2}
doubled.forEach { print("$it , ") }

编辑

据我所知,没有内置的函数可以让你原地映射项目。然而,在您的情况下,您正在处理一个Array,这是一种可变数据结构,因此替代方法是使用旧式循环来迭代地转换其项(您可以使用Iterator将相同的逻辑应用于MutableList或其他可变数据结构来更新值)。像这样:

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 , ") }
}

好的,有没有一种方法可以在不创建新变量的情况下修改它? - Dishonered

6
一种替代方法是使用forEachIndexed而不是map。替换为
someArray.map({num -> num*2})    

by

someArray.forEachIndexed{ index, num -> someArray[index] = num * 2 }    

2

正如许多人所说,该地图返回一个新列表,而不修改原始列表。

重写您打算的代码最有效的方法是执行

// assuming you want to act upon individual elements in the list
fun main(args : Array<String>) {
    val someArray : Array<Int> =  arrayOf(3,53,2,521,51,23,512,34,124);
    println("Original array is $someArray")
    someArray
        .map { it * 2 }
        .forEach { print("$it , ") }
}

或者,如果您只想查看逗号分隔的值列表。
// really just want to print the transformed values instead
fun main(args : Array<String>) {
    val someArray : Array<Int> =  arrayOf(3,53,2,521,51,23,512,34,124);
    println("Original array is $someArray")
    someArray
        .map { it * 2 }
        .also { print(it.joinToString()) }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接