Sekwencje a kolekcje
Kiedy każda z nich sprawdza się najlepiej
Sekwencje a kolekcje to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Sekwencje a kolekcje
Zarówno sekwencje, jak i kolekcje udostępniają te same operacje funkcyjne, ale inaczej je wykonują. Wiedza o tym, kiedy lepiej sprawdza się każde z tych rozwiązań, pomaga pisać wydajny i czytelny kod.
Podsumowanie kolekcji wykonywanych zachłannie
Kolekcje są zachłanne: każda operacja od razu przetwarza wszystkie elementy i tworzy nową kolekcję. Takie rozwiązanie jest proste i szybkie w przypadku niewielkich danych.
fun main() {
val result = listOf(1, 2, 3).map { it + 1 }.filter { it > 2 }
println(result)
}Podsumowanie sekwencji wykonywanych leniwie
Sekwencje są leniwe: operacje tworzą potok, który jest wykonywany element po elemencie dopiero po skonsumowaniu sekwencji, bez tworzenia kolekcji pośrednich.
fun main() {
val result = listOf(1, 2, 3).asSequence().map { it + 1 }.filter { it > 2 }.toList()
println(result)
}Kiedy kolekcje wygrywają
W przypadku małych kolekcji i krótkich łańcuchów kolekcje są zazwyczaj szybsze i czytelniejsze. Sekwencje wprowadzają narzut dla każdego elementu, związany z wywołaniami iteratora, który w przypadku bardzo małych danych może przewyższyć korzyści.
Kiedy sekwencje wygrywają
Sekwencje sprawdzają się lepiej, gdy dane są duże, łańcuch jest długi lub potrzebna jest tylko część wyniku, na przykład pierwsze dopasowanie albo pierwszych N elementów. Nie tworzą dużych list pośrednich i mogą wcześniej zakończyć przetwarzanie.
fun main() {
val firstEvenSquare = (1..1000000).asSequence()
.map { it * it }
.first { it % 2 == 0 }
println(firstEvenSquare)
}Pomiar różnicy
Ten przykład z dużym zakresem pokazuje, jak sekwencja unika utworzenia pośredniej listy zawierającej milion elementów, która powstałaby w wersji zachłannej.
fun main() {
val seqResult = (1..1000).asSequence()
.filter { it % 2 == 0 }
.map { it * 3 }
.take(3)
.toList()
println(seqResult)
}Zużycie pamięci
Łańcuchy wykonywane zachłannie przechowują jednocześnie w pamięci każdą listę pośrednią. Sekwencje zachowują tylko aktualny element przepływający przez potok, więc maksymalne zużycie pamięci pozostaje niewielkie nawet w przypadku długich potoków.
Zaleta wcześniejszego zakończenia
Jeśli operacja końcowa może zakończyć się wcześniej, na przykład first, find lub any, sekwencje pomijają pozostałe elementy. Kolekcje wykonywane zachłannie zdążyłyby już przetworzyć wszystkie elementy.
fun main() {
val found = (1..100).asSequence()
.map { println("checking $it"); it }
.any { it == 3 }
println("Found: $found")
}Uwaga na operacje stanowe
Operacje takie jak sorted, distinct i groupBy wymagają wszystkich elementów, więc ograniczają korzyści z leniwego wykonywania. Potok zdominowany przez takie operacje może nie odnieść korzyści z użycia sekwencji.
Praktyczna wskazówka
Zasada praktyczna: domyślnie należy wybierać kolekcje ze względu na czytelność. Na sekwencję warto przejść przy przetwarzaniu dużych danych, łączeniu wielu operacji lub gdy potrzebny jest tylko niewielki fragment wyniku. Jeśli wydajność ma kluczowe znaczenie, zawsze należy ją zmierzyć.
Ten sam interfejs API, inny mechanizm działania
Ponieważ oba rozwiązania mają te same nazwy operacji, zazwyczaj można przełączać się między nimi, dodając lub usuwając asSequence() oraz końcowe toList(). Dzięki temu eksperymentowanie z wydajnością wiąże się z niewielkim ryzykiem.
fun main() {
val data = listOf(1, 2, 3, 4, 5)
val asList = data.map { it * 2 }.filter { it > 4 }
val asSeq = data.asSequence().map { it * 2 }.filter { it > 4 }.toList()
println(asList == asSeq)
}Szybkie sprawdzenie
W której sytuacji sekwencja najprawdopodobniej będzie wydajniejsza od kolekcji?
Podsumowanie
Kolekcje są wykonywane zachłannie i najlepiej sprawdzają się w przypadku małych danych oraz gdy najważniejsza jest czytelność. Sekwencje są wykonywane leniwie i najlepiej sprawdzają się w przypadku dużych danych, długich łańcuchów lub częściowych wyników, ponieważ nie tworzą list pośrednich i mogą wcześniej zakończyć przetwarzanie. Należy uważać na operacje stanowe. Oba rozwiązania mają ten sam interfejs API, więc przełączanie się między nimi jest łatwe. To kończy kurs dotyczący sekwencji.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Sekwencje a kolekcje” jest bezpłatna?
Tak — pełny tekst „Sekwencje a kolekcje” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Sekwencje a kolekcje”?
Kiedy każda z nich sprawdza się najlepiej Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Sekwencje a kolekcje”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego sekwencje
- Tworzenie sekwencji
- Operacje leniwe
- Sekwencje a kolekcje