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 addy removefuncionar 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 = nully luego más tarde agregar sin llamada!!. Puede superar esto usando lalateinitpalabra 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
MutableListlista.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 ausersVariable mutable con lista mutable:
o sin valor inicial: lista vacía y sin tipo de variable explícita:
users.add(anohterUser)users += anotherUserver 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, inicializarlonullno funcionará. Solo se permiten llamadas afirmadas seguras o no nulas en un receptor de tipo anulableMutableList<Int>.doSomethinglateinitlugar de hacer que la lista sea anulable es la forma correcta de abordar este problema. Sinlateinitembargo, 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
MutableListoArrayList.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
list2es 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
listOfdirecto o la aplicación de una construcción funcional comofoldoreduce, 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
buildListfunción exacta anterior está disponible en la biblioteca estándar como una función experimental, junto con sus análogosbuildSetybuildMap. 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
listesimmutableporDefault, puede usarArrayListen su lugar. Me gusta esto :entonces puedes
add/deleteartículos de esto como a continuación:fuente