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

时间:2018-05-22 10:21:40

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

但地图功能似乎不起作用。这是打印的内容

原始阵列是 3,53,2,521,51,23,512,34,124,更改数组是

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

我的问题是为什么数组的元素值不会翻倍?我在这里失踪了什么?

4 个答案:

答案 0 :(得分:5)

您可以随时定义自己的扩展程序,以满足您的需求:

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

用法如下:

someArray.mapInPlace { num -> num * 2 }

请注意,原始数组有一些特殊的非泛型类,例如IntArray(另请参阅this question),因此您可能应该使用这些类而不是通用类。当然,您必须分别为每个扩展定义此扩展,例如:

fun IntArray.mapInPlace(transform: (Int) -> Int) { ... }
fun DoubleArray.mapInPlace(transform: (Double) -> Double) { ... }

答案 1 :(得分:4)

从文档中,map没有修改项目,而是返回一个List,其中包含应用于所有项目的映射函数的结果:

  

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

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

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

修改

据我所知,没有内置功能允许您就地映射项目。但是,在您的情况下,您正在处理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 , ") }
}

答案 2 :(得分:2)

一种替代方法是使用forEachIndexed而不是map。替换

someArray.map({num -> num*2})    

作者

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

答案 3 :(得分:1)

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

重写预期代码的最有效方法是执行

// 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()) }
}