Kotlin Academy · Oppitunti

Data-luokat kokoelmissa ja Map-avaimina

Käyttäkää data-luokkia joukoissa ja kartoissa hyödyntäen rakenteellista yhtäsuuruutta.

Oppitunti 4/413 vaihetta

Data-luokat kokoelmissa ja Map-avaimina on ilmainen Kotlin Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Kotlin Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Data-luokat arvo-olioina

Koska data-luokat ylikirjoittavat equals- ja hashCode-funktiot rakenteellisesti, ne toimivat erinomaisesti joukoissa ja karttojen avaimina — toisin kuin tavalliset luokat.

Tavallinen luokka: huono Map-avain

Tavallinen luokka käyttää oletusarvoisesti viiteidentiteettiä. Kaksi samalta näyttävää oliota ovat eri Map-avaimia.
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-luokka: oikea Map-avain

Data-luokka käyttää rakenteellista samanarvoisuutta. Kaksi samanlaiset ominaisuudet sisältävää oliota ovat samanarvoisia.
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-luokka joukossa

Joukot käyttävät equals- ja hashCode-funktioita kaksoiskappaleiden poistamiseen. Data-luokat poistavat kaksoiskappaleet oikein.
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 data-luokkien kanssa

Ryhmitelkää kokoelmat käyttämällä avaimena data-luokkaa.
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

Esiintymien laskeminen Mapin avulla

Laskekaa rakenteisten tietojen esiintymät käyttämällä data-luokkaa Map-avaimena.
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}

Sisäkkäiset data-luokat

Data-luokat voivat sisältää muita data-luokkia. Sisäkkäisten data-luokkien equals- ja hashCode-vertailut ovat syviä.
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 data-luokkien kanssa

Järjestäkää data-luokkien instansseista koostuva lista ominaisuuden perusteella.
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-luokat ja välimuisti

Käyttäkää data-luokkia HashMapin avaimina, kun välimuistiavain koostuu useista osista.
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 data-luokilla

distinct() käyttää data-luokkien equals-funktiota kaksoiskappaleiden poistamiseen listasta.
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

Muuttumattomat avaimet ovat turvallisempia

Käyttäkää Map- ja Set-avaimina aina data-luokkia, joiden ominaisuudet ovat val-tyyppisiä. Avaimen muuttaminen lisäämisen jälkeen rikkoo tietorakenteen.
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

Pikatarkistus

Miksi data-luokat toimivat Map-avaimina oikein, vaikka tavalliset luokat usein eivät toimi?

Kertaus

Data-luokat toimivat Map-avaimina ja Set-alkioina, koska niiden equals- ja hashCode-funktiot perustuvat oikein rakenteelliseen samanarvoisuuteen. Käyttäkää val-ominaisuuksia, jotta avaimet pysyvät muuttumattomina. Hyödyntäkää data-luokkien kanssa groupBy-, distinct- ja sortedBy-funktioita tehokkaiden kyselyjen tekemiseen.
Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Data-luokat kokoelmissa ja Map-avaimina” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Data-luokat kokoelmissa ja Map-avaimina”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Kotlin Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Data-luokat kokoelmissa ja Map-avaimina”?

Käyttäkää data-luokkia joukoissa ja kartoissa hyödyntäen rakenteellista yhtäsuuruutta. Harjoittelet Kotlin Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Kotlin Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Kotlin Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Data-luokat kokoelmissa ja Map-avaimina”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Kotlin Academy-oppitunnilla?

Kyllä. Jokainen Kotlin Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Data-luokkien perusteet: automaattisesti luodut metodit
  2. Kopiointi copy()-funktiolla ja osittaiset ylikirjoitukset
  3. Destrukturoivat määritykset componentN-funktioilla
  4. Data-luokat kokoelmissa ja Map-avaimina
← Takaisin: Kotlin Academy