Em Java, poderíamos fazer o seguinte
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Mas se reescrevê-lo para Kotlin diretamente como abaixo
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Eu recebi o erro de não encontrar add
e remove
funcionar da minha lista
Eu trabalho em torno da transmissão para ArrayList, mas é estranho precisar lançá-lo, enquanto no Java a transmissão não é necessária. E isso derrota o propósito de ter a classe abstrata List
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Existe uma maneira de eu usar a lista, mas não precisar transmiti-la, como o que poderia ser feito em Java?
collections
kotlin
Elye
fonte
fonte
myList = null
e, posteriormente, adicionar sem chamar!!
. Você pode superar isso usando alateinit
palavra - chave na frente de sua propriedade da seguinte maneira:lateinit var myList: List<Int>
dessa forma, não será necessário inicializar a lista imediatamente, mas garante ao compilador que a inicializará antes de usar a lista pela primeira vez. É uma solução mais suave, mas coloca uma responsabilidade em você como desenvolvedor.Respostas:
https://kotlinlang.org/docs/reference/collections.html
Você precisará usar uma
MutableList
lista.MutableList<Int> = arrayListOf()
também deve funcionar.fonte
Definindo uma coleção de listas no Kotlin de diferentes maneiras:
Variável imutável com lista imutável (somente leitura):
Variável imutável com lista mutável:
ou sem valor inicial - lista vazia e sem tipo explícito de variável:
users.add(anohterUser)
ouusers += anotherUser
(sob o capô éusers.add(anohterUser)
)Variável mutável com lista imutável:
ou sem valor inicial - lista vazia e sem tipo explícito de variável:
users += anotherUser
- * cria novo ArrayList e o atribui ausers
Variável mutável com lista mutável:
ou sem valor inicial - lista vazia e sem tipo explícito de variável:
users.add(anohterUser)
users += anotherUser
veja também: https://kotlinlang.org/docs/reference/collections.html
fonte
Concorde com todas as respostas acima sobre o uso do MutableList, mas você também pode adicionar / remover da Lista e obter uma nova lista, como abaixo.
Ou
fonte
Aparentemente, a Lista padrão de Kotlin é imutável. Para ter uma lista que pode mudar, use MutableList como abaixo
Atualizado no entanto, não é recomendável usar o MutableList, a menos que para uma lista que você realmente deseja alterar. Refere-se a https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 de como somente leitura coleção fornece melhor codificação.
fonte
MutableList
, no entanto, inicializá-lo comnull
não funcionará. Somente chamadas declaradas seguras ou não nulas são permitidas em um receptor anulável do tipoMutableList<Int>
.doSomething
lateinit
vez de tornar a lista anulável é a maneira correta de resolver esse problema. Não me lembro selateinit
foi adicionado desde o início da Kotlin embora, mas esta é definitivamente a solução hoje em dia para usá-lo :-)No Kotlin você tem que usar
MutableList
ouArrayList
.fonte
Você pode criar um novo como este.
Agora você pode usar a lista2, obrigado.
fonte
https://kotlinlang.org/docs/reference/collections.html
De acordo com o link acima, a Lista <E> é imutável no Kotlin. No entanto, isso funcionaria:
fonte
list2
é uma lista mutável, consulte stackoverflow.com/questions/43114367/… .Confinando a mutabilidade aos construtores
As respostas principais aqui falam corretamente da diferença no Kotlin entre somente leitura
List
(NOTA: é somente leitura, não "imutável" ) eMutableList
.Em geral, deve-se esforçar-se para usar listas somente leitura, no entanto, a mutabilidade ainda é frequentemente útil no momento da construção , especialmente quando se lida com bibliotecas de terceiros com interfaces não funcionais. Nos casos em que as técnicas alternativas de construção não estão disponíveis, como o uso
listOf
direto ou a aplicação de uma construção funcional comofold
oureduce
, uma construção simples de "função construtora" como a seguinte produz uma lista somente leitura de uma lista temporária mutável:e isso pode ser bem encapsulado em uma função de utilitário em linha reutilizável:
que pode ser chamado assim:
Agora, toda a mutabilidade é isolada em um escopo de bloco usado para a construção da lista somente leitura, e o restante do seu código usa a lista somente leitura que é gerada pelo construtor.
ATUALIZAÇÃO : A partir do Kotlin 1.3.70, a
buildList
função exata acima está disponível na biblioteca padrão como uma função experimental, junto com seus análogosbuildSet
ebuildMap
. Consulte https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .fonte
No conceito de dados imutáveis, talvez seja esse o melhor caminho:
fonte
A
list
estáimmutable
prontoDefault
, você pode usarArrayList
. como isso :então você pode
add/delete
itens como abaixo:fonte