Answers:
这很好。
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
之所以起作用,是因为它要求toMutableList()
实现。
===
,不得不说不toList()
复制该收藏,但是toMutableList()
会复制
Iterable.toList()
返回emptyList()
,始终返回相同(不可变)的对象。因此,如果进行测试,emptyList()
您将获得相同的对象。
toMutableList()
如果调用该方法的实例已经是可变列表,则文档授予中的任何内容都不应返回列表的新实例。
您可以使用
列表-> toList()
数组-> toArray()
ArrayList-> toArray()
MutableList-> toMutableList()
例:
val array = arrayListOf("1", "2", "3", "4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
打印日志:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
我可以提出两种替代方法:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
更新:使用新的类型推断引擎(在Kotlin 1.3中启用),我们可以在第一个示例中省略泛型类型参数,并具有以下功能:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
仅供参考,选择新推理的方法是kotlinc -Xnew-inference ./SourceCode.kt
命令行或kotlin { experimental { newInference 'enable'}
Gradle。有关新类型推断的更多信息,请观看以下视频:Svetlana Isakova撰写的KotlinConf 2018-新型类型推断和相关语言功能,特别是30岁的``建筑商的推断''
如果您的列表中包含kotlin数据类,则可以执行此操作
selectedSeries = ArrayList(series.map { it.copy() })
您可以使用提供的扩展名Iterable.toMutableList()
,这将为您提供一个新列表。不幸的是,正如其签名和文档所暗示的那样,它旨在确保an Iterable
是一个List
(toString
与其他许多to<type>
方法一样)。没有什么可以保证您将成为一个新的清单。例如,在扩展名的开头添加以下行:if (this is List) return this
是合理的性能改进(如果确实可以提高性能)。
另外,由于其名称,生成的代码也不是很清楚。
我更喜欢添加自己的扩展名以确保结果并创建更清晰的代码(就像我们对array一样):
fun <T> List<T>.copyOf(): List<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
fun <T> List<T>.mutableCopyOf(): MutableList<T> {
val original = this
return mutableListOf<T>().apply { addAll(original) }
}
请注意,这addAll
是最快的复制方法,因为它System.arraycopy
在的实现中使用本机ArrayList
。
另外,请注意,这只会给您浅表的副本。
addAll(this@copyOf)
,因为this
内部apply
将引用新创建的空列表吗?还是那个mutableListOf<T>().also { it.addAll(this) }
?
我会使用的toCollection()
扩展方法:
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
这将创建一个新MutableList
元素,然后将原始元素的每个元素添加到新创建的列表中。
推断的类型将是MutableList<String>
。如果您不想公开此新列表的可变性,则可以将类型显式声明为不可变列表:
val copy: List<String> = original.toCollection(mutableListOf())
对于简单的列表,上面有许多正确的解决方案。
但是,它仅用于浅表。
以下函数适用于任何二维ArrayList
。ArrayList
实际上等于MutableList
。有趣的是,在使用显式MutableList
类型时它不起作用。如果需要更多尺寸,则有必要增加功能。
fun <T>cloneMatrix(v:ArrayList<ArrayList<T>>):ArrayList<ArrayList<T>>{
var MatrResult = ArrayList<ArrayList<T>>()
for (i in v.indices) MatrResult.add(v[i].clone() as ArrayList<T>)
return MatrResult
}
整数矩阵演示:
var mat = arrayListOf(arrayListOf<Int>(1,2),arrayListOf<Int>(3,12))
var mat2 = ArrayList<ArrayList<Int>>()
mat2 = cloneMatrix<Int>(mat)
mat2[1][1]=5
println(mat[1][1])
表明 12
您可以使用ArrayList
构造函数:ArrayList(list)