Generere primitive strømmer
iterate og generate
Generere primitive strømmer er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Uendelige strømmer trenger grenser
iterate og generate oppretter potensielt uendelige strømmer. De må legge til limit (eller et predikat) for å gjøre dem endelige.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.iterate(1, n -> n + 1)
.limit(5)
.forEach(System.out::println);
}
}iterate med en startverdi
iterate(seed, next) starter med startverdien og bruker funksjonen gjentatte ganger på den forrige verdien.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.iterate(2, n -> n * 2)
.limit(5)
.forEach(System.out::println);
}
}iterate med et Predicate
Varianten med tre argumenter, iterate(seed, hasNext, next), stopper automatisk når predikatet er usant, omtrent som en funksjonell for-løkke.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.iterate(1, n -> n <= 100, n -> n * 3)
.forEach(System.out::println);
}
}generate med en Supplier
generate tar imot en IntSupplier som produserer hvert element uavhengig, uten å være avhengig av den forrige verdien.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.generate(() -> 7)
.limit(3)
.forEach(System.out::println);
}
}Generering av tilfeldige tall
En generate-leverandør kan kalle en tilfeldig kilde. Her er hvert element et uavhengig terningkast.
import java.util.Random;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Random rnd = new Random(42);
IntStream.generate(() -> rnd.nextInt(6) + 1)
.limit(5)
.forEach(System.out::println);
}
}iterate kontra generate
Hovedforskjellen:
iterate: hver verdi avledes fra den forrige (sekvenser).generate: hver verdi produseres uavhengig (konstanter, tilfeldige verdier).
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.iterate(1, n -> n + 1).limit(10).sum();
System.out.println(sum);
}
}Aggregering av genererte strømmer
Når genererte strømmer er begrenset, støtter de alle vanlige aggregater.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
long count = IntStream.iterate(0, n -> n + 2)
.limit(50)
.filter(n -> n % 3 == 0)
.count();
System.out.println(count);
}
}Fibonacci med iterate på en objektstrøm
For tilstandsbaserte sekvenser som Fibonacci kan De bruke Stream.iterate over et par med verdier i en tabell og deretter mappe tilbake til int.
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream.iterate(new int[]{0, 1}, p -> new int[]{p[1], p[0] + p[1]})
.limit(8)
.mapToInt(p -> p[0])
.forEach(System.out::println);
}
}Bygge en tabell fra en generator
Kombiner en generator med toArray for å bygge en primitiv tabell programmatisk.
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] squares = IntStream.iterate(1, n -> n + 1)
.limit(5)
.map(n -> n * n)
.toArray();
System.out.println(Arrays.toString(squares));
}
}Lat evaluering sparer arbeid
Strømmer evalueres lat: med limit genereres bare de nødvendige elementene, selv fra en uendelig kilde.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int first = IntStream.iterate(10, n -> n + 10)
.filter(n -> n > 25)
.findFirst()
.getAsInt();
System.out.println(first);
}
}Foretrekk predikatformen
Den predikatbaserte varianten av iterate er ofte tydeligere enn iterate(...).limit(...), fordi stoppbetingelsen ligger sammen med genereringslogikken.
import java.util.stream.LongStream;
public class Main {
public static void main(String[] args) {
long product = LongStream.iterate(1, n -> n <= 5, n -> n + 1)
.reduce(1, (a, b) -> a * b);
System.out.println(product);
}
}Rask kontroll
Hva skjer hvis De kaller generate uten en limit og deretter utfører en terminal operasjon som forEach?
Oppsummering
De har generert primitive strømmer:
iterateavleder hver verdi fra den forrige.generateproduserer verdier uavhengig fra en leverandør.- Begge er uendelige; begrens dem med
limiteller predikatformen aviterate. - Lat evaluering betyr at bare nødvendige elementer beregnes.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Generere primitive strømmer» gratis?
Ja – hele teksten i «Generere primitive strømmer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Generere primitive strømmer»?
iterate og generate Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Generere primitive strømmer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- IntStream og LongStream
- Intervall- og aggregatoperasjoner
- Avbildning til og fra objektsstrømmer
- Generere primitive strømmer