Kotlin Academy · leksjon

Data classes i samlinger og som Map-nøkler

Bruk data classes i sett og map-er ved å utnytte strukturell likhet.

Leksjon 4 av 413 trinn

Data classes i samlinger og som Map-nøkler er en gratis leksjon i Kotlin Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Kotlin Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Dataklasser som verdiobjekter

Fordi dataklasser overstyrer equals og hashCode strukturelt, fungerer de perfekt i mengder og som nøkler i map – i motsetning til vanlige klasser.

Vanlig klasse: dårlig map-nøkkel

En vanlig klasse bruker referanselikhet som standard. To objekter som ser like ut, er forskjellige map-nøkler.
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

Dataklasse: riktig map-nøkkel

En dataklasse bruker strukturell likhet. To objekter med de samme egenskapene er like.
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

Dataklasse i en mengde

Mengder bruker equals og hashCode til å fjerne duplikater. Dataklasser fjerner duplikater på riktig måte.
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 med dataklasser

Gruppér samlinger etter en dataklasse som nøkkel.
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

Telle forekomster med map

Tell forekomster av strukturerte data ved å bruke en dataklasse som map-nøkkel.
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}

Nestede dataklasser

Dataklasser kan inneholde andre dataklasser. Equals og hashCode sammenligner nestede dataklasser rekursivt.
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 med dataklasser

Sorter en liste med dataklasseinstanser etter en egenskap.
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 })

Dataklasser og hurtigbufring

Bruk dataklasser som hurtigbuffernøkler i en HashMap når hurtigbuffernøkkelen består av flere deler.
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 med dataklasser

distinct() på en liste med dataklasser bruker equals til å fjerne duplikater.
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

Uforanderlige nøkler er tryggere

Bruk alltid dataklasser med val-egenskaper som nøkler i map eller mengder. Hvis du endrer en nøkkel etter innsetting, ødelegges datastrukturen.
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

Rask sjekk

Hvorfor fungerer dataklasser riktig som Map-nøkler, mens vanlige klasser ofte ikke gjør det?

Oppsummering

Dataklasser fungerer som Map-nøkler og mengdeelementer fordi de har korrekt strukturell equals/hashCode. Bruk val-egenskaper for å holde nøklene uforanderlige. Dra nytte av groupBy, distinct og sortedBy med dataklasser for kraftige spørringer.
Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Data classes i samlinger og som Map-nøkler» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Kotlin Academy, inkludert «Data classes i samlinger og som Map-nøkler», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Kotlin Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Data classes i samlinger og som Map-nøkler»?

Bruk data classes i sett og map-er ved å utnytte strukturell likhet. Du øver på Kotlin Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Kotlin Academy?

Ingen tidligere erfaring er nødvendig. Kotlin Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Data classes i samlinger og som Map-nøkler»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Kotlin Academy-leksjonen?

Ja. Alle Kotlin Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende om data class: Automatisk genererte metoder
  2. Kopiere med copy() og delvise overstyringer
  3. Destrukturerende deklarasjoner med componentN
  4. Data classes i samlinger og som Map-nøkler
← Tilbake til Kotlin Academy