Generering af primitive streams
iterate og generate
Generering af primitive streams er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Uendelige streams kræver begrænsninger
iterate og generate opretter potentielt uendelige streams. Du skal tilføje limit (eller et prædikat) for at gø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 startværdi
iterate(seed, next) starter med startværdien og anvender gentagne gange funktionen på den forrige værdi.
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 prædikat
Den version af iterate(seed, hasNext, next) med tre argumenter stopper automatisk, når prædikatet er falsk, ligesom en funktionel 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 tager en IntSupplier, som producerer hvert element uafhængigt uden at afhænge af den forrige værdi.
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
IntStream.generate(() -> 7)
.limit(3)
.forEach(System.out::println);
}
}Generering af tilfældige tal
En generate-leverandør kan kalde en tilfældighedskilde. Her er hvert element et uafhængigt terningekast.
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
Vigtigste forskel:
iterate: hver værdi udledes af den forrige (sekvenser).generate: hver værdi produceres uafhængigt (konstanter, tilfældige værdier).
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);
}
}Sammenlægning af genererede streams
Når de er begrænset, understøtter genererede streams alle normale sammenlægninger.
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 objektstream
Til tilstandsfulde sekvenser som Fibonacci kan du bruge Stream.iterate over et arraypar og derefter mappe tilbage 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);
}
}Oprettelse af et array fra en generator
Kombinér en generator med toArray for programmatisk at oprette et primitivt 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));
}
}Doven evaluering sparer arbejde
Streams evalueres dovent: med limit genereres kun de nødvendige elementer, 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);
}
}Foretræk formen med prædikat
Den prædikatbaserede iterate er ofte tydeligere end iterate(...).limit(...), fordi stopbetingelsen 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);
}
}Hurtigt tjek
Hvad sker der, hvis du kalder generate uden en limit og derefter en terminal operation som forEach?
Opsummering
Du har genereret primitive streams:
iterateudleder hver værdi af den forrige.generateproducerer værdier uafhængigt fra en leverandør.- Begge er uendelige; begræns dem med
limiteller prædikatformen afiterate. - Doven evaluering betyder, at kun de nødvendige elementer beregnes.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Generering af primitive streams” gratis?
Ja — hele teksten til “Generering af primitive streams” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Generering af primitive streams”?
iterate og generate Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Generering af primitive streams”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- IntStream og LongStream
- Interval- og aggregeringsoperationer
- Mapping til og fra object-streams
- Generering af primitive streams