Kotlin Academy · Lekcja

Data class w kolekcjach i jako klucze map

Używaj data class w zbiorach i mapach, korzystając z równości strukturalnej.

Lekcja 4 z 413 kroki

Data class w kolekcjach i jako klucze map 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.

Data class jako obiekty wartości

Ponieważ data class strukturalnie przesłaniają equals i hashCode, doskonale sprawdzają się w zbiorach i jako klucze map — w przeciwieństwie do zwykłych klas.

Zwykła klasa: zły klucz mapy

Zwykła klasa domyślnie używa porównywania referencji. Dwa obiekty wyglądające tak samo są różnymi kluczami mapy.
class Key(val id: Int)  // no equals/hashCode
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)  // same id, different object
map[k1] = "value"
println(map[k2])  // null! k2 != k1 by reference

Data class: poprawny klucz mapy

Data class używa równości strukturalnej. Dwa obiekty z takimi samymi właściwościami są równe.
data class Key(val id: Int)
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)
map[k1] = "value"
println(map[k2])  // "value"! Equal by value

Data class w zbiorze

Zbiory używają equals i hashCode do usuwania duplikatów. Data class są deduplikowane poprawnie.
data class Tag(val name: String)
val tags = mutableSetOf<Tag>()
tags.add(Tag("kotlin"))
tags.add(Tag("kotlin"))  // duplicate
tags.add(Tag("java"))
println(tags.size)  // 2 (not 3)

GroupBy z data class

Grupuj kolekcje według klucza będącego data class.
data class Category(val name: String, val parent: String)
val items = listOf(
    "List" to Category("Collections", "stdlib"),
    "Map" to Category("Collections", "stdlib"),
    "Flow" to Category("Coroutines", "kotlinx")
)
val grouped = items.groupBy { it.second }
println(grouped.keys.size)  // 2

Zliczanie wystąpień za pomocą mapy

Zliczaj wystąpienia ustrukturyzowanych danych, używając data class jako klucza mapy.
data class Pair2(val x: Int, val y: Int)
val points = listOf(Pair2(1,2), Pair2(1,2), Pair2(3,4))
val counts = points.groupingBy { it }.eachCount()
println(counts)  // {Pair2(x=1, y=2)=2, Pair2(x=3, y=4)=1}

Zagnieżdżone data class

Data class mogą zawierać inne data class. Equals i hashCode działają głęboko dla zagnieżdżonych data class.
data class Address(val city: String, val country: String)
data class Person(val name: String, val address: Address)
val p1 = Person("Alice", Address("Berlin", "DE"))
val p2 = Person("Alice", Address("Berlin", "DE"))
println(p1 == p2)  // true

sortedBy z data class

Sortuj listę instancji data class według właściwości.
data class Student(val name: String, val grade: Double)
val students = listOf(
    Student("Bob", 3.2),
    Student("Alice", 3.8),
    Student("Charlie", 2.9)
)
println(students.sortedBy { it.grade })

Data class i buforowanie

Używaj data class jako kluczy bufora w HashMap, gdy klucz bufora jest złożony.
data class CacheKey(val userId: Long, val resourceType: String)
val cache = HashMap<CacheKey, ByteArray>()
val key = CacheKey(42, "avatar")
cache[key] = byteArrayOf(1, 2, 3)
println(cache[CacheKey(42, "avatar")] != null)  // true

distinct dla data class

distinct() na liście data class używa ich equals do usuwania duplikatów.
data class Event(val type: String, val ts: Long)
val events = listOf(
    Event("click", 1000),
    Event("click", 1000),  // duplicate
    Event("scroll", 2000)
)
println(events.distinct().size)  // 2

Niemutowalne klucze są bezpieczniejsze

Zawsze używaj data class z właściwościami val jako kluczy map i zbiorów. Zmodyfikowanie klucza po jego dodaniu uszkadza strukturę danych.
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

Szybkie sprawdzenie

Dlaczego data class działają poprawnie jako klucze map, a zwykłe klasy często nie?

Podsumowanie

Data class mogą być kluczami map i elementami zbiorów, ponieważ mają poprawnie zdefiniowane strukturalne equals/hashCode. Używaj właściwości val, aby klucze były niemutowalne. Wykorzystuj groupBy, distinct i sortedBy z data class do tworzenia zaawansowanych zapytań.
Bezpłatny start

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 „Data class w kolekcjach i jako klucze map” jest bezpłatna?

Tak — pełny tekst „Data class w kolekcjach i jako klucze map” 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 „Data class w kolekcjach i jako klucze map”?

Używaj data class w zbiorach i mapach, korzystając z równości strukturalnej. Ć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 „Data class w kolekcjach i jako klucze map”?

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

  1. Podstawy data class: automatycznie generowane metody
  2. Kopiowanie za pomocą copy() i częściowe przesłanianie
  3. Deklaracje destrukturyzujące z componentN
  4. Data class w kolekcjach i jako klucze map
← Powrót do Kotlin Academy