Kotlin Academy · Oppitunti

Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella

Rakentakaa monivaiheisia putkia ja käyttäkää Sequencea laiskaan evaluointiin.

Oppitunti 4/413 vaihetta

Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella 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.

Ongelma: väliaikaiset listat

Jokainen kokoelmaoperaatio, kuten filter tai map, luo uuden listan. Suurilla kokoelmilla tai pitkissä ketjuissa tämä kuluttaa turhaan muistia ja aikaa.

Innokas ja laiska arviointi

Kokoelmaoperaatiot ovat innokkaita: jokainen vaihe käsittelee koko listan loppuun ennen seuraavaa vaihetta. Sequence-operaatiot ovat laiskoja: yksi alkio käsitellään kaikkien vaiheiden läpi ennen seuraavaan alkioon siirtymistä.

Sequenceksi muuntaminen

Kutsukaa asSequence(), kun haluatte vaihtaa innokkaasta (lista) käsittelystä laiskaan (Sequence) käsittelyyn.
val result = (1..1_000_000)
    .asSequence()
    .filter { it % 2 == 0 }
    .map { it * it }
    .take(5)
    .toList()
println(result)  // [4, 16, 36, 64, 100]

Sequence on laiska: työtä ei tehdä ennen terminaalioperaatiota

Laskentaa ei tapahdu ennen kuin kutsutte terminaalioperaattoria, kuten toList-, first- tai sum-operaatiota.
val seq = generateSequence(1) { it + 1 }  // infinite!
    .filter { it % 3 == 0 }
    .map { it * it }
val first5 = seq.take(5).toList()
println(first5)  // [9, 36, 81, 144, 225]

generateSequence: äärettömät sekvenssit

generateSequence luo laiskoja äärettömiä sekvenssejä.
val fibonacci = generateSequence(Pair(0, 1)) { (a, b) -> Pair(b, a + b) }
    .map { it.first }
val first10 = fibonacci.take(10).toList()
println(first10)  // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

sequence-rakentaja

sequence { } -rakentaja ja yield luovat mukautettuja laiskoja sekvenssejä.
val evens = sequence {
    var n = 0
    while (true) {
        yield(n)
        n += 2
    }
}
println(evens.take(5).toList())  // [0, 2, 4, 6, 8]

Milloin Sequencea käytetään

Käyttäkää Sequencea, kun kokoelma on suuri (>1000 alkiota), käytätte useita ketjutettuja operaatioita ja/tai tarvitsette vain pienen osan tuloksista.

Milloin Sequencea EI käytetä

Pienillä kokoelmilla (<100 alkiota) sekvenssit lisäävät ylimääräistä kuormaa. Iteraattoriin perustuva mekanismi on lyhyissä ketjuissa hitaampi.
// Overkill for small list:
listOf(1, 2, 3).asSequence().map { it * 2 }.toList()
// Just use:
listOf(1, 2, 3).map { it * 2 }

Sequencen terminaalioperaatiot

Terminaalioperaatiot käynnistävät käsittelyn. Yleisiä ovat: toList(), first(), last(), count(), sum(), any(), all() ja none().
val s = (1..100).asSequence().filter { it % 7 == 0 }
println(s.first())          // 7
println(s.count())          // 14
println(s.sum())            // 728

Tilalliset ja tilattomat operaatiot

Jotkin Sequence-operaatiot ovat tilallisia, kuten sort ja distinct — niiden on nähtävä kaikki alkiot ennen tulosten tuottamista. Ne rikkovat laiskan arvioinnin.
val s = (1..10).asSequence()
    .filter { it > 3 }   // stateless: lazy
    .sorted()            // stateful: must see all elements
    .take(3).toList()
println(s)  // [4, 5, 6]

constrainOnce: yhden iteraation turvallisuus

Käyttäkää constrainOnce()-funktiota, jotta Sequence aiheuttaa virheen, jos sitä iteroidaan useita kertoja — tämä on hyödyllistä virtojen kanssa.
val seq = generateSequence(1) { if (it < 5) it + 1 else null }
    .constrainOnce()
val first = seq.toList()   // OK
// val second = seq.toList()  // IllegalStateException!

Pikatarkistus

Milloin Sequence alkaa käsitellä alkioita?

Kertaus

Sequencet ovat laiskoja — työtä ei tehdä ennen terminaalioperaatiota. Käyttäkää asSequence()-funktiota suurille kokoelmille, joissa on useita ketjutettuja operaatioita. generateSequence ja sequence { } luovat äärettömiä laiskoja virtoja. Terminaalioperaatiot käynnistävät käsittelyn.
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 ”Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Kotlin Academy-oppimispolun 3 oppituntia, myös oppitunnin “Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella”. 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 ”Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella”?

Rakentakaa monivaiheisia putkia ja käyttäkää Sequencea laiskaan evaluointiin. 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 ”Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella”-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. map ja flatMap: jokaisen alkion muuntaminen
  2. filter, filterNot ja partition
  3. fold, reduce ja runningFold
  4. Putkien ketjuttaminen ja väliaikaisten listojen välttäminen Sequencella
← Takaisin: Kotlin Academy