Java 8 Stream überspringen () vs limit ()

1. Einleitung

In diesem kurzen Artikel werden wir über die Methoden skip () und limit () der Java Stream-API sprechen und ihre Ähnlichkeiten und Unterschiede hervorheben.

Obwohl diese beiden Operationen auf den ersten Blick ziemlich ähnlich aussehen, verhalten sie sich tatsächlich sehr unterschiedlich und sind nicht austauschbar. Tatsächlich ergänzen sie sich und können nützlich sein, wenn sie zusammen verwendet werden. Lesen Sie weiter, um mehr über sie zu erfahren.

2. Die skip () -Methode

Die Methode skip (n) ist eine Zwischenoperation, bei der die ersten n Elemente eines Streams verworfen werden . Der Parameter n darf nicht negativ sein. Wenn er höher als die Größe des Streams ist, gibt skip () einen leeren Stream zurück.

Sehen wir uns ein Beispiel an:

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 diesem Stream nehmen wir die geraden Zahlen des Streams auf, überspringen jedoch die ersten beiden. Daher ist unser Ergebnis:

6 8 10

Wenn dieser Stream ausgeführt wird, fragt forEach nach Elementen. Wenn es darum geht, () zu überspringen , weiß dieser Vorgang, dass die ersten beiden Elemente verworfen werden müssen, sodass sie nicht zum resultierenden Stream hinzugefügt werden. Danach wird ein Stream mit den verbleibenden Elementen erstellt und zurückgegeben.

Zu diesem Zweck muss die Operation skip () den Status der Elemente beibehalten, die zu jedem Zeitpunkt angezeigt werden. Aus diesem Grund sagen wir, dass skip () eine zustandsbehaftete Operation ist .

3. Die limit () Methode

Die Methode limit (n) ist eine weitere Zwischenoperation, die einen Stream zurückgibt, der nicht länger als die angeforderte Größe ist . Nach wie vor kann der Parameter n nicht negativ sein.

Verwenden wir es in einem Beispiel:

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 diesem Fall nehmen wir nur zwei gerade Zahlen aus unserem int- Stream auf :

2 4

Wie es der Fall mit dem Überspringen () Betrieb limit () ist auch ein Stateful - Betrieb , da sie den Zustand der Gegenstände zu halten haben , die abgeholt werden.

Im Gegensatz zu skip () , das den gesamten Stream verbraucht, verbraucht limit () , sobald die maximale Anzahl von Elementen erreicht ist, keine weiteren Elemente mehr und gibt einfach den resultierenden Stream zurück. Daher sagen wir, dass limit () eine Kurzschlussoperation ist .

Wenn Sie mit unendlichen Streams arbeiten, kann limit () sehr nützlich sein, um einen Stream in einen endlichen zu kürzen:

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

In diesem Beispiel kürzen wir einen unendlichen Zahlenstrom in einen Strom mit nur zehn geraden Zahlen.

4. Kombinieren Sie skip () und limit ()

Wie bereits erwähnt, ergänzen sich die Sprung- und Begrenzungsoperationen , und wenn wir sie kombinieren, können sie in einigen Fällen sehr hilfreich sein.

Stellen wir uns vor, wir möchten unser vorheriges Beispiel so ändern, dass es in Zehnerreihen gerade Zahlen erhält. Wir können das einfach tun, indem wir sowohl skip () als auch limit () im selben Stream verwenden:

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()); }

Wie wir sehen können, können wir mit dieser Methode ziemlich leicht durch den Strom paginieren. Obwohl dies eine sehr vereinfachte Paginierung ist, können wir sehen, wie mächtig dies sein kann, wenn ein Stream geschnitten wird.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir die Ähnlichkeiten und Unterschiede der Methoden skip () und limit () der Java Stream-API gezeigt. Wir haben auch einige einfache Beispiele implementiert, um zu zeigen, wie wir diese Methoden verwenden können.

Wie immer ist der vollständige Quellcode für die Beispiele auf GitHub verfügbar.