如何在Kotlin中不使用集合映射复制或克隆数据对象的mutableList

时间:2018-11-30 08:03:14

标签: kotlin immutablelist mutablelist

我创建一个MutableList的副本。当我更新副本MutableList的元素值但原始列表元素值也更改时。当我使用map时,它工作正常,但就像整个列表的迭代一样,有没有迭代的方法吗?如何复制MutableList的元素。

    val array: MutableList<UserData> = ArrayList()
    val userData = UserData("DataOne")
    array.add(userData)

    val arrayCopy = ImmutableList.copyOf(array)// not working
    //val arrayCopy = array.toMutableList()// not working
   // val arrayCopy = array.map { it.copy() }.toMutableList()//working

    Log.i("----> array ", array[0].name)//print DataOne
    Log.i("----> arrayCopy ", arrayCopy[0].name)//print DataOne

    arrayCopy[0].name = "DataTwo"
    Log.d("----> array ", array[0].name)//print DataTwo
    Log.d("----> arrayCopy", arrayCopy[0].name) //print DataTwo

2 个答案:

答案 0 :(得分:0)

ImmutableList.copyOf确实复制了列表。问题是您还想复制列表中的元素。当然,您必须遍历列表才能做到这一点,但是copyOf也是如此,我不明白为什么您希望可以避免这种情况。 map的更好版本是

 array.mapTo(mutableListOf()) { it.copy() }

因为它只迭代一次。

答案 1 :(得分:0)

很抱歉,但是没有其他方法导致转换一个元素,您将不得不读取/复制一次,对于n个元素,您必须迭代n次才能获得正确的副本。 我唯一想到的另一种方法是首先创建所需的不可变/可变列表,而不是稍后再复制所有列表。 希望这会有所帮助