Java Academy · Oppitunti

Infinite Streams with iterate and generate

Luo äärettömiä streameja Stream.iterate- ja Stream.generate-metodeilla ja pysäytä ne sitten limit- tai take-while-operaatiolla.

Oppitunti 4/413 vaihetta

Infinite Streams with iterate and generate on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä ovat äärettömät streamit?

Java Streamit voivat olla äärettömiä — ne tuottavat alkioita tarpeen mukaan ilman loppua. Ne on päätettävä rajoittavalla operaatiolla (limit, takeWhile, findFirst jne.), jotta suoritus ei jatku ikuisesti.

Stream.iterate: siemenarvoon perustuvat sarjat

Stream.iterate(seed, f) tuottaa äärettömän streamin soveltamalla f-funktiota toistuvasti edelliseen arvoon. Ensimmäinen alkio on siemenarvo.

// Infinite even numbers: 0, 2, 4, 6, 8, ...
Stream.iterate(0, n -> n + 2)
    .limit(10)
    .forEach(System.out::println);

iterate ja Predicate (Java 9+)

Stream.iterate(seed, predicate, f) lisää pysäytysehdon — samoin kuin ehdollinen for-silmukka. Stream pysähtyy, kun predikaatti on epätosi.

// Equivalent to: for (int i = 1; i <= 100; i *= 2)
Stream.iterate(1, n -> n <= 100, n -> n * 2)
    .forEach(System.out::println); // 1 2 4 8 16 32 64

Stream.generate: tilaton generaattori

Stream.generate(Supplier) kutsuu Supplieria jokaiselle alkiolle. Supplier voi olla tilaton (satunnaisluvut) tai tilallinen (ulkoisen laskurin avulla).

// Infinite random doubles between 0.0 and 1.0:
Stream.generate(Math::random)
    .limit(5)
    .forEach(System.out::println);

UUID-tunnisteiden luominen

Käyttäkää generate-metodia ja UUID::randomUUID-metodiviitettä yksilöllisten tunnisteiden streamin luomiseen eräajon tunnisteiden tuottamista varten.

List<String> ids = Stream.generate(() -> UUID.randomUUID().toString())
    .limit(100)
    .collect(Collectors.toList());
System.out.println(ids.size()); // 100

Fibonaccin lukujen tuottaminen iterate-menetelmällä

Tuottakaa Fibonaccin lukuja parina esitettävän tilan avulla. Java 9:n kaksiparametrinen iterate tekee tästä elegantin.

Stream.iterate(new long[]{0, 1}, p -> new long[]{p[1], p[0]+p[1]})
    .limit(10)
    .map(p -> p[0])
    .forEach(System.out::println); // 0 1 1 2 3 5 8 13 21 34

takeWhile ja dropWhile (Java 9+)

takeWhile(predicate) ottaa alkioita niin kauan kuin predikaatti toteutuu ja pysähtyy sen jälkeen. dropWhile ohittaa alkioita, kunnes predikaatti ei enää toteudu, ja ottaa sitten loput alkiot.

// takeWhile stops at the first element where predicate is false:
Stream.iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println); // 1 2 3 4 5 6 7 8 9

Äärettömät streamit uudelleenyrityspollaukseen

Mallintakaa pollauslooppi generate-metodilla: tuottakaa tarkistustuloksia, käyttäkää takeWhile-metodia niin kauan kuin ehto ei täyty ja ottakaa sitten ensimmäinen onnistuminen.

Optional<String> result = Stream.generate(() -> checkJobStatus(jobId))
    .takeWhile(status -> status.equals("PENDING"))
    .findFirst();
// When job completes, takeWhile stops and findFirst gets "DONE"

IntStream.range ja rangeClosed

Rajattuihin kokonaislukusarjoihin IntStream.range(start, end) ja rangeClosed(start, end) ovat tehokkaampia kuin iterate.

// Sum 1 to 1000:
int sum = IntStream.rangeClosed(1, 1000).sum();
System.out.println(sum); // 500500

LongStream.iterate pitkille lukusarjoille

Käyttäkää pitkille lukusarjoille LongStream.iterate-metodia, jotta vältätte Stream<Long>-tyypin autoboxauksen aiheuttaman yleiskustannuksen.

long sumOfPrimes = LongStream.iterate(2, n -> n + 1)
    .filter(n -> isPrime(n))
    .limit(1000)
    .sum();

Äärettömät streamit ovat laiskoja

Äärettömät streamit eivät esikäsittele alkioita. Kukin alkio luodaan vasta, kun pääteoperaatio pyytää sitä. Tämän laiskuuden ansiosta äärettömät streamit ovat käytännöllisiä.

Pikatarkistus

Mitä pysäytysmekanismia tarvitaan äärettömän streamin kanssa työskenneltäessä?

Kertaus

iterate(seed, f) sekvensseihin ja generate(supplier) itsenäisten alkioiden tuottamiseen. Lisätkää aina oikosulkeva pääteoperaatio (limit, takeWhile, findFirst). Äärettömät streamit ovat laiskoja — ne materialisoituvat vain tarpeen mukaan.

Aloita maksutta

Opi Java 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
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Infinite Streams with iterate and generate” ilmainen?

Kyllä – oppitunnin ”Infinite Streams with iterate and generate” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Infinite Streams with iterate and generate”?

Luo äärettömiä streameja Stream.iterate- ja Stream.generate-metodeilla ja pysäytä ne sitten limit- tai take-while-operaatiolla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java 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 ”Infinite Streams with iterate and generate”-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ä Java Academy-oppitunnilla?

Kyllä. Jokainen Java 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. flatMap sisäkkäisille kokoelmille
  2. Rinnakkaiset streamit: suorituskyky ja sudenkuopat
  3. Spliterator: jakaminen rinnakkaisuutta varten
  4. Infinite Streams with iterate and generate
← Takaisin: Java Academy