Java 8 Stream skip () vs limit ()

1. Introduktion

I denne korte artikel vil vi tale om springe() og begrænse() metoder til Java Stream API og fremhæve deres ligheder og forskelle.

Selvom disse to operationer i starten måske ser ret ens ud, opfører de sig faktisk meget forskelligt og kan ikke udskiftes. Faktisk er de komplementære og kan være nyttige, når de bruges sammen. Fortsæt læsning for at lære mere om dem.

2. Den springe() Metode

Det spring (n) metoden er en mellemdrift, der kasserer den første n elementer i en strøm. Det n parameteren kan ikke være negativ, og hvis den er højere end streamens størrelse, springe() returnerer en tom strøm.

Lad os se et eksempel:

Stream.of (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Filter (i -> i% 2 == 0). Skib (2) .forEach (i -> System. out.print (i + ""));

I denne strøm samler vi lige tal på strømmen, men vi springer de første to over. Derfor er vores resultat:

6 8 10

Når denne stream udføres, vises for hver begynder at bede om varer. Når det kommer til springe(), denne operation ved, at de to første elementer skal kasseres, så den føjer dem ikke til den resulterende strøm. Derefter opretter og returnerer den en stream med de resterende varer.

For at gøre dette skal springe() operationen skal holde tilstanden for elementerne set i hvert øjeblik. Af denne grund, vi siger det springe() er en stateful operation.

3. Den begrænse() Metode

Det grænse (n) metoden er en anden mellemhandling, der returnerer en stream, der ikke er længere end den ønskede størrelse. Som før, n parameter kan ikke være negativ.

Lad os bruge det i et eksempel:

Stream.of (1, 2, 3, 4, 5, 6, 7, 8, 9, 10). Filter (i -> i% 2 == 0) .begrænsning (2) .for hver (i -> System. out.print (i + ""));

I dette tilfælde henter vi kun to lige numre fra vores strøm af int:

2 4

Som det er tilfældet med springe() operation, begrænse() er også en stateful operation, da den skal holde tilstanden for de emner, der afhentes.

Men i modsætning til springe(), som fortærer hele strømmen, så snart begrænse() når det maksimale antal varer, forbruger den ikke flere varer og returnerer simpelthen den resulterende strøm. Derfor, vi siger det begrænse() er en kortslutningsoperation.

Når du arbejder med uendelige strømme, begrænse() kan være meget nyttigt til at trunke en stream til en endelig:

Stream.iterate (0, i -> i + 1). Filter (i -> i% 2 == 0) .limit (10) .forEach (System.out :: println);

I dette eksempel trunker vi en uendelig strøm af tal ind i en strøm med kun ti lige tal.

4. Kombination springe() og begrænse()

Som vi nævnte tidligere, springe og begrænse operationer er komplementære, og hvis vi kombinerer dem, kan de i nogle tilfælde være meget nyttige.

Lad os forestille os, at vi vil ændre vores tidligere eksempel, så det får lige tal i batches af ti. Vi kan gøre det ved blot at bruge begge dele springe() og begrænse() på samme strøm:

privat statisk liste getEvenNumbers (int offset, int limit) {return Stream.iterate (0, i -> i + 1). filter (i -> i% 2 == 0). skib (offset). limit (limit). indsamle (Collectors.toList ()); }

Som vi kan se, kan vi paginere gennem strømmen ganske let med denne metode. Selvom dette er en meget forenklet pagination, kan vi se, hvor kraftig dette kan være, når du skiver en strøm.

5. Konklusion

I denne korte artikel har vi vist ligheder og forskelle i springe() og begrænse() metoder til Java Stream API. Vi har også implementeret nogle enkle eksempler for at vise, hvordan vi kan bruge disse metoder.

Som altid er den fulde kildekode til eksemplerne tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found