Java 8 Stream skip () vs limit ()

1. Introduksjon

I denne korte artikkelen vil vi snakke om hopp over () og grense() metoder for Java Stream API og markere deres likheter og forskjeller.

Selv om disse to operasjonene kan se ganske like ut i begynnelsen, oppfører de seg faktisk veldig annerledes og er ikke utskiftbare. Egentlig er de komplementære og kan være nyttige når de brukes sammen. Fortsett å lese for å lære mer om dem.

2. Den hopp over () Metode

De hopp over (n) metoden er en mellomdrift som forkaster den første n elementer i en strøm. De n parameteren kan ikke være negativ, og hvis den er høyere enn størrelsen på strømmen, hopp over () returnerer en tom strøm.

La oss se et eksempel:

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

I denne strømmen tar vi opp jevne tall for strømmen, men vi hopper over de to første. Derfor er resultatet vårt:

6 8 10

Når denne strømmen kjøres, blir for hver begynner å be om ting. Når det kommer til hopp over (), denne operasjonen vet at de to første elementene må kastes, så den legger dem ikke til den resulterende strømmen. Etter det oppretter og returnerer den en strøm med de gjenværende elementene.

For å gjøre dette, er hopp over () operasjonen må holde tilstanden til elementene sett i hvert øyeblikk. Av denne grunn, vi sier det hopp over () er en stateful operasjon.

3. Den grense() Metode

De grense (n) metoden er en annen mellomoperasjon som returnerer en strøm som ikke er lengre enn ønsket størrelse. Som før, den n parameteren kan ikke være negativ.

La oss bruke det i et eksempel:

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

I dette tilfellet henter vi bare to partall fra vår strøm av int:

2 4

Som det er tilfellet med hopp over () operasjon, grense() er også en stateful operasjon siden den må beholde tilstanden til elementene som blir plukket opp.

Men i motsetning til hopp over (), som forbruker hele strømmen, så snart grense() når maksimalt antall varer, bruker den ikke flere varer og returnerer bare den resulterende strømmen. Derfor, vi sier det grense() er en kortslutningsoperasjon.

Når du arbeider med uendelige strømmer, grense() kan være veldig nyttig for å kutte en strøm til en endelig:

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

I dette eksemplet avkorter vi en uendelig strøm av tall til en strøm med bare ti partall.

4. Kombinere hopp over () og grense()

Som vi nevnte tidligere, hopp over og grense operasjoner er komplementære, og hvis vi kombinerer dem, kan de være svært nyttige i noen tilfeller.

La oss forestille oss at vi vil endre vårt forrige eksempel slik at det får partall i antall på ti. Vi kan gjøre det ganske enkelt ved å bruke begge deler hopp over () og grense() i samme strøm:

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

Som vi kan se, kan vi paginere gjennom strømmen ganske enkelt med denne metoden. Selv om dette er en veldig forenklet paginering, kan vi se hvor kraftig dette kan være når du skjærer en strøm.

5. Konklusjon

I denne korte artikkelen har vi vist likhetene og forskjellene mellom hopp over () og grense() metoder for Java Stream API. Vi har også implementert noen enkle eksempler for å vise hvordan vi kan bruke disse metodene.

Som alltid er hele kildekoden for eksemplene tilgjengelig på GitHub.


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