Sekvenssit ja kokoelmat
Milloin kumpikin on parempi
Sekvenssit ja kokoelmat 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.
Sekvenssit ja kokoelmat
Sekvenssit ja kokoelmat tarjoavat samat funktionaaliset operaatiot, mutta arvioivat ne eri tavoin. Kun tietää, milloin kumpikin on tehokkaampi, voi kirjoittaa suorituskykyistä ja helposti luettavaa koodia.
Innokkaasti arvioitavien kokoelmien kertaus
Kokoelmat ovat eager-tyyppisiä: jokainen operaatio käsittelee kaikki alkiot ja tuottaa uuden kokoelman heti. Tämä on yksinkertaista ja nopeaa pienen datamäärän kanssa.
fun main() {
val result = listOf(1, 2, 3).map { it + 1 }.filter { it > 2 }
println(result)
}Laiskojen sekvenssien kertaus
Sekvenssit ovat lazy-tyyppisiä: operaatiot rakentavat käsittelyputken, joka käsittelee alkiot yksitellen vasta kulutettaessa, joten väliaikaisia kokoelmia ei tarvita.
fun main() {
val result = listOf(1, 2, 3).asSequence().map { it + 1 }.filter { it > 2 }.toList()
println(result)
}Milloin kokoelmat ovat parempia
Pienten kokoelmien ja lyhyiden ketjujen tapauksessa kokoelmat ovat yleensä nopeampia ja selkeämpiä. Sekvenssit aiheuttavat alkiokohtaista lisäkustannusta (iteraattorikutsuja), joka voi pienellä datamäärällä kumota niiden hyödyt.
Milloin sekvenssit ovat parempia
Sekvenssit ovat parempia, kun dataa on paljon, ketju on pitkä tai tuloksesta tarvitaan vain osa, kuten ensimmäinen osuma tai ensimmäiset N alkiota. Ne välttävät suurten väliaikaisten listojen luomisen ja lopettavat käsittelyn aikaisin.
fun main() {
val firstEvenSquare = (1..1000000).asSequence()
.map { it * it }
.first { it % 2 == 0 }
println(firstEvenSquare)
}Eron mittaaminen
Tämä esimerkki suurella lukuvälillä osoittaa, kuinka sekvenssi välttää miljoonan alkion väliaikaisen listan tuottamisen, jonka eager-versio loisi.
fun main() {
val seqResult = (1..1000).asSequence()
.filter { it % 2 == 0 }
.map { it * 3 }
.take(3)
.toList()
println(seqResult)
}Muistijalanjälki
Eager-ketjut pitävät kaikki väliaikaiset listat samanaikaisesti muistissa. Sekvenssit säilyttävät vain käsittelyputken läpi kulkevan nykyisen alkion, joten pitkien putkien suurin muistinkulutus pysyy pienenä.
Aikaisen keskeytyksen etu
Jos pääteoperaatio voi päättyä aikaisin (first, find, any), sekvenssit ohittavat loput alkiot, kun taas eager-kokoelmat olisivat jo käsitelleet kaiken.
fun main() {
val found = (1..100).asSequence()
.map { println("checking $it"); it }
.any { it == 3 }
println("Found: $found")
}Tilallisia operaatioita on syytä tarkkailla
Operaatiot, kuten sorted, distinct ja groupBy, tarvitsevat kaikki alkiot, joten ne vähentävät laiskuuden hyötyä. Näitä operaatioita paljon sisältävä käsittelyputki ei välttämättä hyödy sekvenssistä.
Käytännön ohje
Nyrkkisääntö: käytä oletusarvoisesti kokoelmia niiden selkeyden vuoksi. Vaihda sekvenssiin, kun käsittelet suurta datamäärää, ketjutat useita operaatioita tai tarvitset tuloksesta vain pienen osan. Suorituskyvyn ollessa kriittinen mittaa vaikutus aina erikseen.
Sama API, eri toteutus
Koska molemmilla on samat operaationimet, toteutuksen voi yleensä vaihtaa lisäämällä tai poistamalla asSequence()-kutsun ja päättävän toList()-kutsun. Näin suorituskyvyn kokeileminen on vähäriskistä.
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)
}Pikatarkistus
Missä tilanteessa sekvenssi todennäköisimmin päihittää kokoelman suorituskyvyssä?
Kertaus
Kokoelmat ovat eager-tyyppisiä ja sopivat parhaiten pieneen datamäärään sekä selkeyttä painottavaan koodiin. Sekvenssit ovat lazy-tyyppisiä ja sopivat parhaiten suureen datamäärään, pitkiin ketjuihin tai osittaisiin tuloksiin, koska ne eivät luo väliaikaisia listoja ja voivat keskeyttää käsittelyn aikaisin. Tilallisten operaatioiden kanssa on syytä olla tarkkana. Molemmilla on sama API, joten vaihtaminen on helppoa. Tämä päättää Sequences-kurssin.
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 ”Sekvenssit ja kokoelmat” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sekvenssit ja kokoelmat”. 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 ”Sekvenssit ja kokoelmat”?
Milloin kumpikin on parempi 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 ”Sekvenssit ja kokoelmat”-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
- Miksi sekvenssejä käytetään
- Sekvenssien luominen
- Laiskat operaatiot
- Sekvenssit ja kokoelmat