Stream Java 8 preskočiť () vs limit ()

1. Úvod

V tomto krátkom článku si povieme niečo o preskočiť () a limit () metódy Java Stream API a zdôrazniť ich podobnosti a rozdiely.

Aj keď tieto dve operácie môžu zo začiatku vyzerať dosť podobne, v skutočnosti sa správajú veľmi odlišne a nie sú zameniteľné. V skutočnosti sú komplementárne a môžu byť užitočné, ak sa používajú spoločne. Pokračujte v čítaní, aby ste sa o nich dozvedeli viac.

2. The preskočiť () Metóda

The preskočiť (n) metóda je stredná operácia, ktorá zahodí prvú n prvky prúdu. The n parameter nemôže byť záporný, a ak je väčší ako veľkosť streamu, preskočiť () vráti prázdny prúd.

Pozrime sa na príklad:

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

V tomto streame zbierame párne čísla streamu, ale prvé dva preskočíme. Preto je náš výsledok:

6 8 10

Keď sa tento prúd vykoná, pre každý začne pýtať položky. Až sa to dostane preskočiť (), táto operácia vie, že prvé dve položky musia byť zahodené, takže ich nepridá do výsledného toku. Potom vytvorí a vráti prúd so zvyšnými položkami.

Za týmto účelom preskočiť () prevádzka musí udržiavať stav prvkov videných v každom okamihu. Pre tento dôvod, hovoríme to preskočiť () je stavová prevádzka.

3. The limit () Metóda

The limit (n) metóda je iná sprostredkujúca operácia, ktorá vráti prúd nie dlhší ako požadovaná veľkosť. Rovnako ako predtým, n parameter nemôže byť záporný.

Použime to v príklade:

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

V tomto prípade vyberáme iba dve párne čísla z nášho toku int:

2 4

Ako je to v prípade preskočiť () prevádzka, limit () je tiež stavová operácia, pretože musí udržiavať stav vecí, ktoré sa preberajú.

Ale na rozdiel od preskočiť (), ktorý spotrebuje celý prúd, akonáhle limit () dosiahne maximálny počet položiek, nespotrebuje ďalšie položky a výsledný prúd jednoducho vráti. Teda hovoríme to limit () je skratová operácia.

Pri práci s nekonečnými prúdmi limit () môže byť veľmi užitočné na skrátenie prúdu na konečný:

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

V tomto príklade skrátime nekonečný prúd čísel na prúd s iba desiatimi párnymi číslami.

4. Kombinovanie preskočiť () a limit ()

Ako sme už spomenuli, preskočiť a limit operácie sa navzájom dopĺňajú a ak ich skombinujeme, môžu byť v niektorých prípadoch veľmi užitočné.

Predstavme si, že chceme upraviť náš predchádzajúci príklad tak, aby dostal párne čísla v dávkach po desať. Môžeme to urobiť jednoducho použitím oboch preskočiť () a limit () v rovnakom streame:

private static List getEvenNumbers (int offset, int limit) {return Stream.iterate (0, i -> i + 1) .filter (i -> i% 2 == 0) .skip (offset) .limit (limit). collect (Collectors.toList ()); }

Ako vidíme, touto metódou môžeme stránkovať prúd celkom ľahko. Aj keď je to veľmi zjednodušené stránkovanie, vidíme, aké silné to môže byť pri krájaní streamu.

5. Záver

V tomto krátkom článku sme si ukázali podobnosti a rozdiely preskočiť () a limit () metódy Java Stream API. Implementovali sme tiež niekoľko jednoduchých príkladov, ktoré ukazujú, ako môžeme tieto metódy použiť.

Úplný zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


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