Java Academy · Lektion

Generera primitiva strömmar

iterate och generate.

Lektion 4 av 413 steg

Generera primitiva strömmar är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Oändliga strömmar behöver begränsningar

iterate och generate skapar potentiellt oändliga strömmar. Du måste lägga till limit eller ett predikat för att göra dem ändliga.

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);
    }
}

iterera med ett startvärde

iterate(seed, next) börjar med startvärdet och tillämpar upprepade gånger funktionen på det föregående värdet.

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);
    }
}

iterera med ett predikat

Den treargumenterade iterate(seed, hasNext, next) avslutas automatiskt när predikatet är falskt, ungefär som en funktionell for-loop.

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);
    }
}

generera med en Supplier

generate tar emot en IntSupplier som producerar varje element oberoende av de andra, utan att vara beroende av det föregående värdet.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntStream.generate(() -> 7)
            .limit(3)
            .forEach(System.out::println);
    }
}

Generera slumptal

En leverantör till generate kan anropa en slumpkälla. Här är varje element ett oberoende tärningskast.

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 jämfört med generate

Viktig skillnad:

  • iterate: varje värde härleds från det föregående värdet (sekvenser).
  • generate: varje värde produceras oberoende (konstanter, slumptal).
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);
    }
}

Aggregera genererade strömmar

När de har begränsats stöder genererade strömmar alla vanliga aggregatoperationer.

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 objektsström

För tillståndsberoende sekvenser som Fibonacci använder du Stream.iterate över ett par av arrayer och mappar sedan tillbaka till 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);
    }
}

Skapa en array från en generator

Kombinera en generator med toArray för att programmatiskt skapa en primitiv array.

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));
    }
}

Lata strömmar sparar arbete

Strömmar är lata: med limit genereras bara de element som behövs, även från en oändlig källa.

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);
    }
}

Föredra predikatformen

Den predikatbaserade formen av iterate är ofta tydligare än iterate(...).limit(...), eftersom stoppvillkoret finns tillsammans med genereringslogiken.

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);
    }
}

Snabb kontroll

Vad händer om du anropar generate utan limit och sedan använder en terminal operation som forEach?

Sammanfattning

Du genererade primitiva strömmar:

  • iterate härleder varje värde från det föregående.
  • generate producerar värden oberoende från en leverantör.
  • Båda är oändliga. Begränsa dem med limit eller predikatformen av iterate.
  • Lat beräkning innebär att endast de element som behövs beräknas.
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”Generera primitiva strömmar” gratis?

Ja – hela texten till ”Generera primitiva strömmar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Generera primitiva strömmar”?

iterate och generate. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Generera primitiva strömmar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. IntStream och LongStream
  2. Intervall- och aggregatoperationer
  3. Mappa till och från objektströmmar
  4. Generera primitiva strömmar
← Tillbaka till Java Academy