如何在 Kotlin 中复制列表?
我正在使用
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
有没有更简单的方法?
这个很好用。
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
也可以工作,因为它在实现中调用了toMutableList()
。 - Flávio Faria===
测试了一下,我不得不说 toList()
不会复制集合,而 toMutableList()
会。 - Peppermint PaddyIterable.toList()
返回 emptyList()
,它始终返回相同的(不可变)对象。因此,如果您使用 emptyList()
进行测试,您将获得相同的对象。 翻译后: - Laurence GonsalvestoMutableList()
返回一个新的列表,“返回一个由此集合中所有元素填充的新的MutableList”。 - Pär Nils Amsen您可以使用
List -> toList()
Array -> 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
array
实际上是一个ArrayList
,而arrayCopy
是一个Array
。它们的命名是误导性的。 - k314159如果您的列表中包含 Kotlin 数据类,您可以这样做。
selectedSeries = ArrayList(series.map { it.copy() })
selectedSeries = series.map { it.copy() }.toMutableList()
。 - Samuel我可以提供两种替代方法:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
更新:随着 Kotlin 1.3 中新的类型推断引擎(可选择加入),我们可以省略第一个示例中的泛型类型参数,从而得到:
val list = listOf("a", "b", "c")
val first = list.first()
1. val selectedSeries = mutableListOf().apply { addAll(series) }
提醒一下,启用新推理的方法是使用命令行:kotlinc -Xnew-inference ./SourceCode.kt
或者在Gradle中使用 kotlin { experimental { newInference 'enable'}
。如果想了解更多关于新类型推断的信息,请查看这个视频:KotlinConf 2018 - New Type Inference and Related Language Features by Svetlana Isakova,特别是其中的“构建器推断”部分(在30分钟处)。
List.addAll
相同 https://stackoverflow.com/questions/54381327/difference-between-arraylist-addalllist-and-new-arraylistlist-for-content 使用https://dev59.com/11YN5IYBdhLWcg3w07Bx#46846074进行测试 https://try.kotlinlang.org/#/UserProjects/pllbim18v1vfa6one4i8l0hasj/497pnhfpsmvb73sn2378cv692d - user25 val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
地图:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
假设你的目标是JVM(或Android);我不确定它是否适用于其他目标,因为它依赖于ArrayList和HashMap的拷贝构造函数。
你可以使用提供的扩展函数Iterable.toMutableList()
,它将为你提供一个新的列表。不幸的是,正如其签名和文档所建议的那样,它旨在确保Iterable
是一个List
(就像toString
和许多其他to<type>
方法一样)。没有什么能保证它会成为一个新的列表。例如,在扩展程序的开头添加以下行:if (this is List) return this
是一种合法的性能改进(如果确实提高了性能)。
此外,由于其名称,产生的代码并不是非常清晰。
我更喜欢添加自己的扩展函数,以确保结果并创建一个更加清晰的代码(就像我们为数组所做的那样):
fun <T> List<T>.copyOf(): List<T> {
return mutableListOf<T>().also { it.addAll(this) }
}
fun <T> List<T>.mutableCopyOf(): MutableList<T> {
return mutableListOf<T>().also { it.addAll(this) }
}
请注意,addAll
是最快的复制方式,因为在实现ArrayList
的时候使用了本地System.arraycopy
。
此外,请注意这只会给你一个浅拷贝。
编辑:
您可能希望使用更通用的版本:
fun <T> Collection<T>.copyOf(): Collection<T> {
return mutableListOf<T>().also { it.addAll(this) }
}
fun <T> Collection<T>.mutableCopyOf(): MutableCollection<T> {
return mutableListOf<T>().also { it.addAll(this) }
}
addAll(this@copyOf)
吗,因为 apply
内部的 this
将会指向新创建的空列表?或者改为 mutableListOf<T>().also { it.addAll(this) }
? - Franko Leon Tokalić如果要进行浅拷贝,我建议
.map{it}
这对许多集合类型都适用。
ArrayList
构造函数:ArrayList(list)
。var oldList: List<ClassA>?
val newList = oldList.map { it.copy() }
val selectedSeries = listOf(*series.toTypedArray())