Kotlin中map函数处理数组未修改元素值的原因排查
为什么Kotlin的map函数没让数组元素翻倍?
嗨,这是个新手很容易踩的坑,我来给你捋明白!
问题的核心在于你对Kotlin中map函数的认知偏差:map是个无副作用的纯函数,它根本不会修改原数组,只会返回一个包含转换后元素的全新集合。你的代码里调用了someArray.map({num -> num*2}),但完全没接收这个返回的新集合,相当于白做了转换操作,原数组自然纹丝不动。
怎么修正?
你需要把map的结果存起来,或者直接替换原数组(如果不需要保留原数据的话)。
方法1:保存到新变量(推荐)
这种方式能保留原数组,更符合函数式编程的设计思想:
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 , ") } // 接收map返回的List,转成Array类型(map默认返回List) val doubledArray = someArray.map { num -> num * 2 }.toTypedArray() println("\nChanged array is ") doubledArray.forEach { print("$it , ") } }
方法2:直接替换原数组
如果不需要保留原数组,可以把原变量改成var,再将map结果赋值回去:
fun main(args : Array<String>){ var someArray : Array<Int> = arrayOf(3,53,2,521,51,23,512,34,124); // 改为可变变量var println("Original array is ") someArray.forEach { print("$it , ") } // 重新赋值原数组 someArray = someArray.map { it * 2 }.toTypedArray() println("\nChanged array is ") someArray.forEach { print("$it , ") } }
额外小技巧:如果用MutableList怎么办?
如果你使用的是MutableList而非Array,还可以用replaceAll直接修改原集合,不需要创建新对象:
fun main(args : Array<String>){ val someList = mutableListOf(3,53,2,521,51,23,512,34,124) println("Original list is ") someList.forEach { print("$it , ") } someList.replaceAll { it * 2 } // 直接修改原集合 println("\nChanged list is ") someList.forEach { print("$it , ") } }
最后再划个重点:Kotlin里的map、filter、flatMap这类集合操作函数,都是只返回新结果、不修改原集合的纯函数。必须接收它们的返回值,才能看到转换后的效果哦!
内容的提问来源于stack exchange,提问作者Dishonered
相关产品推荐
相关产品推荐

