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.
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 64Stream.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()); // 100Fibonaccin 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 34takeWhile 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); // 500500LongStream.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.
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
- flatMap sisäkkäisille kokoelmille
- Rinnakkaiset streamit: suorituskyky ja sudenkuopat
- Spliterator: jakaminen rinnakkaisuutta varten
- Infinite Streams with iterate and generate