Java 8 adatfolyam átugrása () vs korlátozás ()

1. Bemutatkozás

Ebben a rövid cikkben a kihagy () és határ() a Java Stream API metódusai, és kiemelik azok hasonlóságait és különbségeit.

Annak ellenére, hogy ez a két művelet eleinte meglehetősen hasonlónak tűnhet, valójában nagyon eltérő módon viselkednek, és nem helyettesíthetők. Valójában kiegészítik egymást, és hasznosak lehetnek, ha együtt használják őket. Olvassa tovább, hogy többet tudjon meg róluk.

2. A kihagy () Módszer

A kihagy (n) módszer egy az elsőt elvető közbenső művelet n patak elemei. A n paraméter nem lehet negatív, és ha nagyobb, mint az adatfolyam mérete, kihagy () üres folyamot ad vissza.

Lássunk egy példát:

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

Ebben a folyamban felvesszük a patak páros számát, de az első kettőt kihagyjuk. Ezért az eredményünk:

6 8 10

Amikor ezt a folyamot végrehajtják, a az egyes tárgyakat kezd kérni. Amikor eljut kihagy (), ez a művelet tudja, hogy az első két elemet el kell dobni, ezért nem adja hozzá őket a kapott adatfolyamhoz. Ezt követően létrehozza és visszaküldi a többi elemet tartalmazó adatfolyamot.

Ennek érdekében a kihagy () a műveletnek meg kell őriznie az egyes pillanatokban látható elemek állapotát. Emiatt, ezt mondjuk kihagy () állapotszerű művelet.

3. Az határ() Módszer

A határ (n) módszer egy másik közbenső művelet, amely a kért méretnél nem hosszabb adatfolyamot ad vissza. Mint korábban, a n paraméter nem lehet negatív.

Használjuk egy példában:

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

Ebben az esetben csak két páros számot veszünk fel az adatfolyamunkból int:

2 4

Ahogy a kihagy () művelet, határ() szintén állapotszerű művelet, mivel meg kell őriznie a felvett elemek állapotát.

De ellentétben kihagy (), amely a teljes folyamot felemészti, amint határ() eléri a tételek maximális számát, nem fogyaszt több tételt, és egyszerűen visszaküldi a kapott adatfolyamot. Ennélfogva, ezt mondjuk határ() rövidzárlati művelet.

Ha végtelen adatfolyamokkal dolgozunk, határ() nagyon hasznos lehet egy adatfolyam végesre csonkolásához:

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

Ebben a példában egy végtelen számáramot csonkolunk csak tíz páros számú folyammá.

4. Kombinálás kihagy () és határ()

Mint korábban említettük, a kihagy és határ a műveletek kiegészítik egymást, és ha összekapcsoljuk őket, bizonyos esetekben nagyon hasznosak lehetnek.

Képzeljük el, hogy az előző példánkat úgy akarjuk módosítani, hogy páros számokat kapjon tízes tételekben. Megtehetjük ezt egyszerűen mindkettő használatával kihagy () és határ() ugyanazon a folyamon:

privát statikus lista getEvenNumbers (int offset, int limit) {return Stream.iterate (0, i -> i + 1) .filter (i -> i% 2 == 0) .skip (offset) .limit (limit). gyűjt (Collectors.toList ()); }

Mint láthatjuk, ezzel a módszerrel elég könnyen lapozhatunk a patakban. Annak ellenére, hogy ez egy nagyon leegyszerűsített oldalszámozás, láthatjuk, hogy ez milyen erős lehet egy patak szeletelésekor.

5. Következtetés

Ebben a rövid cikkben megmutattuk a kihagy () és határ() a Java Stream API metódusai. Néhány egyszerű példát is bemutattunk annak bemutatására, hogyan használhatjuk ezeket a módszereket.

Mint mindig, a példák teljes forráskódja elérhető a GitHubon.