Java Academy · leksjon

Generere primitive strømmer

iterate og generate

Leksjon 4 av 413 trinn

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:

  • iterate avleder hver verdi fra den forrige.
  • generate produserer verdier uavhengig fra en leverandør.
  • Begge er uendelige; begrens dem med limit eller predikatformen av iterate.
  • Lat evaluering betyr at bare nødvendige elementer beregnes.
Gratis å komme i gang

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

  1. IntStream og LongStream
  2. Intervall- og aggregatoperasjoner
  3. Avbildning til og fra objektsstrømmer
  4. Generere primitive strømmer
← Tilbake til Java Academy