代码之家  ›  专栏  ›  技术社区  ›  Dishonered

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

  •  3
  • Dishonered  · 技术社区  · 6 年前

    我正在使用此代码。

    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,

    我的问题是,为什么数组的元素值不加倍?我错过了什么?

    3 回复  |  直到 5 年前
        1
  •  5
  •   zsmb13    6 年前

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

    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) { ... }
    
        2
  •  5
  •   user2340612    6 年前

    从文件中, 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 , ") }
    }
    
        3
  •  1
  •   Ryba    6 年前

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

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

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