Java 8 stream overslaan () versus limiet ()

1. Inleiding

In dit korte artikel zullen we praten over de overspringen() en limiet() methoden van de Java Stream API en benadruk hun overeenkomsten en verschillen.

Hoewel deze twee bewerkingen er in eerste instantie misschien erg op lijken, gedragen ze zich eigenlijk heel anders en zijn ze niet uitwisselbaar. Eigenlijk zijn ze complementair en kunnen ze handig zijn als ze samen worden gebruikt. Blijf lezen om er meer over te weten te komen.

2. Het overspringen() Methode

De overslaan (n) methode is een tussenliggende bewerking die de eerste weggooit n elementen van een stroom. De n parameter mag niet negatief zijn, en als het hoger is dan de grootte van de stream, overspringen() geeft een lege stream terug.

Laten we een voorbeeld bekijken:

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 + ""));

In deze stream halen we de even nummers van de stream op, maar slaan we de eerste twee over. Daarom is ons resultaat:

6 8 10

Wanneer deze stream wordt uitgevoerd, wordt het voor elk begint om items te vragen. Wanneer het zover komt overspringen(), weet deze bewerking dat de eerste twee items moeten worden weggegooid, dus worden ze niet toegevoegd aan de resulterende stream. Daarna wordt een stream gemaakt en geretourneerd met de resterende items.

Om dit te doen, moet het overspringen() de operatie moet de toestand van de elementen die op elk moment worden waargenomen, behouden. Om deze reden, dat zeggen we overspringen() is een stateful operatie.

3. Het limiet() Methode

De limiet (n) methode is een andere tussenliggende bewerking die een stream retourneert die niet langer is dan de gevraagde grootte. Net als voorheen, de n parameter mag niet negatief zijn.

Laten we het in een voorbeeld gebruiken:

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

In dit geval halen we slechts twee even nummers op uit onze stream van int:

2 4

Net als bij de overspringen() operatie, limiet() is ook een stateful operatie omdat het de staat moet behouden van de items die worden opgehaald.

Maar niet zoals overspringen(), die de hele stream verbruikt, zodra limiet() het maximale aantal items bereikt, verbruikt het geen items meer en retourneert eenvoudig de resulterende stream. Vandaar, dat zeggen we limiet() is een kortsluitingsoperatie.

Bij het werken met oneindige streams, limiet() kan erg handig zijn om een ​​stroom af te kappen tot een eindige stroom:

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

In dit voorbeeld kappen we een oneindige stroom getallen af ​​tot een stroom met slechts tien even getallen.

4. Combineren overspringen() en limiet()

Zoals we eerder al zeiden, de overspringen en limiet bewerkingen zijn complementair en als we ze combineren, kunnen ze in sommige gevallen zeer nuttig zijn.

Laten we ons voorstellen dat we ons vorige voorbeeld willen wijzigen zodat het even getallen krijgt in batches van tien. We kunnen dat eenvoudig doen door beide te gebruiken overspringen() en limiet() op dezelfde stream:

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

Zoals we kunnen zien, kunnen we met deze methode vrij gemakkelijk door de stream bladeren. Hoewel dit een erg simplistische paginering is, kunnen we zien hoe krachtig dit kan zijn bij het doorsnijden van een stream.

5. Conclusie

In dit korte artikel hebben we de overeenkomsten en verschillen van de overspringen() en limiet() methoden van de Java Stream API. We hebben ook enkele eenvoudige voorbeelden geïmplementeerd om te laten zien hoe we deze methoden kunnen gebruiken.

Zoals altijd is de volledige broncode voor de voorbeelden beschikbaar op GitHub.