En Java podríamos hacer lo siguiente
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Pero si lo reescribimos a Kotlin directamente como se muestra a continuación
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Recibí el error de no encontrar add
y remove
funcionar de mi lista
Trabajo para enviarlo a ArrayList, pero es extraño tener que hacerlo, mientras que en Java no es necesario. Y eso anula el propósito de tener la clase abstracta Lista
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
¿Hay alguna forma de usar List pero sin necesidad de lanzarlo, como lo que se podría hacer en Java?
collections
kotlin
Elye
fuente
fuente
myList = null
y luego más tarde agregar sin llamada!!
. Puede superar esto usando lalateinit
palabra clave frente a su propiedad delateinit var myList: List<Int>
esta manera : de esta manera no necesitará inicializar la lista de inmediato, pero le garantiza al compilador que la inicializará antes de usar la lista la primera vez. Es una solución más fluida, pero te responsabiliza como desarrollador.Respuestas:
https://kotlinlang.org/docs/reference/collections.html
Tendrás que usar una
MutableList
lista.MutableList<Int> = arrayListOf()
También debería funcionar.fuente
Definición de una colección de listas en Kotlin de diferentes maneras:
Variable inmutable con lista inmutable (solo lectura):
Variable inmutable con lista mutable:
o sin valor inicial: lista vacía y sin tipo de variable explícita:
users.add(anohterUser)
ousers += anotherUser
(debajo del capó esusers.add(anohterUser)
)Variable mutable con lista inmutable:
o sin valor inicial: lista vacía y sin tipo de variable explícita:
users += anotherUser
- * crea una nueva ArrayList y la asigna ausers
Variable mutable con lista mutable:
o sin valor inicial: lista vacía y sin tipo de variable explícita:
users.add(anohterUser)
users += anotherUser
ver también: https://kotlinlang.org/docs/reference/collections.html
fuente
De acuerdo con todas las respuestas anteriores sobre el uso de MutableList, pero también puede agregar / eliminar de la lista y obtener una nueva lista como se muestra a continuación.
O
fuente
Aparentemente, la Lista predeterminada de Kotlin es inmutable. Para tener una Lista que pueda cambiar, uno debe usar MutableList como se muestra a continuación
Actualizado Sin embargo, no se recomienda el uso MutableList a menos de una lista que realmente quiere cambiar. Se refiere a https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 para ver cómo la colección de solo lectura proporciona una mejor codificación.
fuente
MutableList
, sin embargo, inicializarlonull
no funcionará. Solo se permiten llamadas afirmadas seguras o no nulas en un receptor de tipo anulableMutableList<Int>
.doSomething
lateinit
lugar de hacer que la lista sea anulable es la forma correcta de abordar este problema. Sinlateinit
embargo, no recuerdo si se agregó desde el comienzo de Kotlin, pero esta es definitivamente la solución hoy en día para usarlo :-)En Kotlin tienes que usar
MutableList
oArrayList
.fuente
Puedes hacerlo con crear uno nuevo como este.
Ahora puedes usar list2, gracias.
fuente
https://kotlinlang.org/docs/reference/collections.html
Según el enlace anterior, la Lista <E> es inmutable en Kotlin. Sin embargo, esto funcionaría:
fuente
list2
es una lista mutable, consulte stackoverflow.com/questions/43114367/… .Confinando la mutabilidad a los constructores
Las principales respuestas aquí hablan correctamente de la diferencia en Kotlin entre solo lectura
List
(NOTA: es de solo lectura, no "inmutable" ) yMutableList
.En general, uno debe esforzarse por usar listas de solo lectura, sin embargo, la mutabilidad sigue siendo útil a menudo en el momento de la construcción , especialmente cuando se trata de bibliotecas de terceros con interfaces no funcionales. Para los casos en los que las técnicas de construcción alternativas no están disponibles, como el uso
listOf
directo o la aplicación de una construcción funcional comofold
oreduce
, una construcción simple de "función constructora" como la siguiente produce muy bien una lista de solo lectura de una mutable temporal:y esto se puede encapsular muy bien en una función de utilidad en línea reutilizable:
que se puede llamar así:
Ahora, toda la mutabilidad está aislada en un ámbito de bloque utilizado para la construcción de la lista de solo lectura, y el resto de su código usa la lista de solo lectura que se genera desde el generador.
ACTUALIZACIÓN : A partir de Kotlin 1.3.70, la
buildList
función exacta anterior está disponible en la biblioteca estándar como una función experimental, junto con sus análogosbuildSet
ybuildMap
. Ver https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .fuente
En concepto de datos inmutables, tal vez esta sea una mejor manera:
fuente
A
list
esimmutable
porDefault
, puede usarArrayList
en su lugar. Me gusta esto :entonces puedes
add/delete
artículos de esto como a continuación:fuente