Respostas:
Isso funciona bem.
val selectedSeries = series.toMutableList()
val selectedSeries = series.toList()
também funciona porque chama toMutableList()
em sua implementação.
===
e tenho que dizer toList()
que não copia a coleção, mas toMutableList()
sim
Iterable.toList()
retorna emptyList()
, que sempre retorna o mesmo objeto (imutável). Portanto, se você testar com, emptyList()
obterá o mesmo objeto de volta.
toMutableList()
deva retornar uma nova instância de uma lista se a instância que chama o método já é uma lista mutável.
Você pode usar
Listar -> toList ()
Array -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Exemplo:
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())
imprimir log:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Posso propor duas maneiras alternativas:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Atualização: com o novo mecanismo de inferência de tipo (opcional no Kotlin 1.3), podemos omitir o parâmetro de tipo genérico no primeiro exemplo e ter este:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
Para sua informação. A maneira de ativar a nova Inferência é kotlinc -Xnew-inference ./SourceCode.kt
por linha de comando ou kotlin { experimental { newInference 'enable'}
para Gradle. Para obter mais informações sobre a nova inferência de tipo, confira este vídeo: KotlinConf 2018 - Nova inferência de tipo e recursos de linguagem relacionados por Svetlana Isakova , especialmente 'inferência para construtores' em 30 '
Se sua lista contém classes de dados kotlin , você pode fazer isso
selectedSeries = ArrayList(series.map { it.copy() })
Você pode usar a extensão fornecida, Iterable.toMutableList()
que fornecerá uma nova lista. Infelizmente, como sua assinatura e documentação sugerem, ele serve para garantir que um Iterable
é um List
(assim como toString
e muitos outros to<type>
métodos). Nada garante que será uma lista nova . Por exemplo, adicionar a seguinte linha no início da extensão: if (this is List) return this
é uma melhoria de desempenho legítima (se de fato melhora o desempenho).
Além disso, por causa de seu nome, o código resultante não é muito claro.
Prefiro adicionar minha própria extensão para ter certeza do resultado e criar um código muito mais claro (assim como temos para matrizes ):
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) }
}
Observe que addAll
é a maneira mais rápida de copiar porque usa o nativo System.arraycopy
na implementação de ArrayList
.
Além disso, tome cuidado, pois isso só lhe dará uma cópia superficial .
addAll(this@copyOf)
, porque this
dentro apply
vai se referir à lista vazia recém-criada? Isso ou mutableListOf<T>().also { it.addAll(this) }
?
Para uma cópia superficial, sugiro
.map{it}
Isso funcionará para muitos tipos de coleção.
Map
s. Ele compila, mas como it
é um Map.Entry
e a cópia é superficial, você tem as mesmas entradas.
Assim como em Java:
Lista:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Mapa:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
Supondo que você esteja visando o JVM (ou Android); Não tenho certeza se funciona para outros destinos, pois se baseia nos construtores de cópia de ArrayList e HashMap.
Eu usaria o toCollection()
método de extensão :
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Isso criará um novo MutableList
e, em seguida, adicionará cada elemento do original à lista recém-criada.
O tipo inferido aqui será MutableList<String>
. Se você não quiser expor a mutabilidade dessa nova lista, pode declarar o tipo explicitamente como uma lista imutável:
val copy: List<String> = original.toCollection(mutableListOf())
Para listas simples, há muitas soluções corretas acima.
No entanto, é apenas para listas rasas.
A função abaixo funciona para qualquer bidimensional ArrayList
. ArrayList
é, na prática, equivalente a MutableList
. Curiosamente, não funciona ao usar um MutableList
tipo explícito . Se alguém precisa de mais dimensões, é necessário fazer mais funções.
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
}
Demonstração para matriz inteira:
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])
isto mostra 12
Você pode usar o ArrayList
construtor:ArrayList(list)