W Javie możemy wykonać następujące czynności
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Ale jeśli przepiszemy go bezpośrednio do Kotlin, jak poniżej
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Wystąpił błąd polegający na nie znalezieniu add
i remove
niedziałaniu z mojej listy
Pracuję nad rzutowaniem go na ArrayList, ale dziwne jest, że trzeba go rzutować, podczas gdy w Javie rzutowanie nie jest wymagane. I to przeczy celowi posiadania abstrakcyjnej listy klas
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Czy jest jakiś sposób na użycie listy, ale nie muszę jej przesyłać, tak jak to można zrobić w Javie?
collections
kotlin
Elye
źródło
źródło
myList = null
a później dodaj bez połączenia!!
. Możesz temu zaradzić, używająclateinit
słowa kluczowego przed swoją właściwością wlateinit var myList: List<Int>
ten sposób : w ten sposób nie będziesz musiał natychmiast inicjować listy, ale gwarantujesz kompilatorowi, że zainicjujesz ją przed pierwszym użyciem listy. Jest to płynniejsze rozwiązanie, ale nakłada na ciebie odpowiedzialność jako programista.Odpowiedzi:
https://kotlinlang.org/docs/reference/collections.html
Musisz użyć
MutableList
listy.MutableList<Int> = arrayListOf()
powinien również działać.źródło
Definiowanie kolekcji list w Kotlinie na różne sposoby:
Niezmienna zmienna z niezmienną (tylko do odczytu) listą:
Niezmienna zmienna z listą zmiennych:
lub bez wartości początkowej - pusta lista i bez jawnego typu zmiennej:
users.add(anohterUser)
lubusers += anotherUser
(pod maską tousers.add(anohterUser)
)Zmienna zmienna z niezmienną listą:
lub bez wartości początkowej - pusta lista i bez jawnego typu zmiennej:
users += anotherUser
- * tworzy nową ArrayList i przypisuje ją dousers
Zmienna zmienna z listą zmiennych:
lub bez wartości początkowej - pusta lista i bez jawnego typu zmiennej:
users.add(anohterUser)
users += anotherUser
patrz także: https://kotlinlang.org/docs/reference/collections.html
źródło
Zgadzam się z wszystkimi powyższymi odpowiedziami dotyczącymi korzystania z MutableList, ale możesz także dodać / usunąć z listy i uzyskać nową listę, jak poniżej.
Lub
źródło
Najwyraźniej domyślna lista Kotlin jest niezmienna. Aby mieć Listę, którą można zmienić, należy użyć MutableList jak poniżej
Zaktualizowano Niemniej jednak nie zaleca się używania MutableList, chyba że lista, którą naprawdę chcesz zmienić. Odnosi się do https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359, aby dowiedzieć się, jak kolekcja tylko do odczytu zapewnia lepsze kodowanie.
źródło
MutableList
, jednak inicjowanie gonull
nie zadziała. Tylko bezpieczne lub niezerowe potwierdzone połączenia są dozwolone na zerowanym odbiorniku typuMutableList<Int>
.doSomething
lateinit
zamiast robienia listy zerowej jest właściwym sposobem na rozwiązanie tego problemu. Nie pamiętam jednak, czylateinit
został dodany od początku Kotlina, ale obecnie jest to zdecydowanie rozwiązanie, aby go użyć :-)W Kotlin musisz użyć
MutableList
lubArrayList
.źródło
Możesz zrobić z takim nowym.
Teraz możesz używać list2, dziękuję.
źródło
https://kotlinlang.org/docs/reference/collections.html
Zgodnie z powyższym linkiem Lista <E> jest niezmienna w Kotlinie. Jednak to zadziałałoby:
źródło
list2
znajduje się lista zmienny, patrz stackoverflow.com/questions/43114367/... .Ograniczanie zmienności do konstruktorów
Najlepsze odpowiedzi tutaj poprawnie mówią o różnicy w Kotlin między tylko do odczytu
List
(UWAGA: jest tylko do odczytu, a nie „niezmienny” ), iMutableList
.Zasadniczo należy dążyć do korzystania z list tylko do odczytu, jednak zmienność jest często często przydatna w czasie budowy , szczególnie w przypadku bibliotek stron trzecich z niefunkcjonalnymi interfejsami. W przypadkach, w których alternatywne techniki konstrukcyjne nie są dostępne, takie jak
listOf
bezpośrednie użycie lub zastosowanie konstruktu funkcjonalnego, takiego jakfold
lubreduce
prosty konstrukt „funkcji konstruktora”, taki jak poniżej, ładnie tworzy listę tylko do odczytu z tymczasowej zmiennej:i można to ładnie zamknąć w wbudowanej funkcji narzędziowej wielokrotnego użytku:
które można nazwać tak:
Teraz cała zmienność jest izolowana do jednego zakresu blokowego używanego do budowy listy tylko do odczytu, a reszta kodu używa listy tylko do odczytu, która jest wyprowadzana z programu budującego.
AKTUALIZACJA : Od Kotlin 1.3.70 powyższa dokładna
buildList
funkcja jest dostępna w standardowej bibliotece jako funkcja eksperymentalna, wraz z jej analogamibuildSet
ibuildMap
. Zobacz https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .źródło
W koncepcji niezmiennych danych może to być lepszy sposób:
źródło
A
list
jestimmutable
gotoweDefault
, możesz użyćArrayList
zamiast tego. lubię to :wtedy możesz
add/delete
przedmioty z tego jak poniżej:źródło