Wie bekomme ich das letzte Element eines Streams in Java?

Wie bekomme ich das letzte Element eines Streams in Java?

1. Überblick

Die JavaStream-API war das Hauptmerkmal der Java 8-Version. Streams stellen träge bewertete Sequenzen von Objekten dar und bieten eine reichhaltige, fließende und monadische API.

In diesem Artikel sehen wir uns kurz an, wie Sie das letzte Element vonStream. erhalten. Beachten Sie, dassdue to the nature of streams, it’s not a natural operation. Stellen Sie immer sicher, dass Sie nicht mit unendlichStreams.arbeiten

2. Verwenden derReduce-API

Reduce reduziert einfach ausgedrückt die Menge der Elemente inStream auf ein einzelnes Element.

In diesem Fall reduzieren wir die Menge der Elemente, um das letzte Element inStream.zu erhalten. Beachten Sie, dassthis method will only return deterministic results for sequential Streams.

Verwenden wirList vonString Werten, erhalten dieStream ausList und reduzieren dann:

List valueList = new ArrayList<>();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

Stream stream = valueList.stream();
stream.reduce((first, second) -> second)
  .orElse(null);

Hier wird der Stream auf eine Ebene reduziert, auf der nur das letzte Element übrig bleibt. Wenn der Stream leer ist, wird der Wert vonnullzurückgegeben.

2. Verwendung der Skip-Funktion

Der andere Weg, um das letzte Element des Streams zu erhalten, istby skipping all the elements before it. Dies kann mit der FunktionSkipder KlasseStreamerreicht werden. Beachten Sie, dass wir in diesem Fall dieStream zweimal verbrauchen, sodass sich einige deutliche Auswirkungen auf die Leistung. ergeben

Erstellen Sie einList von Zeichenfolgenwerten und verwenden Sie diesize-Funktion, um zu bestimmen, wie viele Elemente übersprungen werden müssen, um das letzte Element zu erreichen.

Hier ist der Beispielcode, der das letzte Element mitskip abruft:

List valueList = new ArrayList();
valueList.add("Joe");
valueList.add("John");
valueList.add("Sean");

long count = valueList.stream().count();
Stream stream = valueList.stream();

stream.skip(count - 1).findFirst().get();

“Sean” ist das letzte Element.

4. Das letzte Element eines unendlichen Streams abrufen

Der Versuch, das letzte Element des unendlichen Stroms zu erhalten, würde zu einer unendlichen Folge von Auswertungen führen, die für unendliche Elemente durchgeführt werden. Sowohlskip als auchreduce kommen nicht von der Ausführung der Auswertung zurück, es sei denn, wir beschränken den unendlichen Strom mit der Operationlimitauf eine bestimmte Anzahl von Elementen.

Hier ist der Beispielcode, in dem wir einen unendlichen Stream aufgenommen und versucht haben, das letzte Element abzurufen:

Stream stream = Stream.iterate(0, i -> i + 1);
stream.reduce((first, second) -> second).orElse(null);

Folglich kommt der Stream nicht von der Auswertung zurück und endet mithalting the execution of the program.

5. Fazit

Wir haben verschiedene Möglichkeiten gesehen, das letzte Element vonStream sowohl mitreduce als auch mitSkip APIs zu erhalten. Wir haben auch untersucht, warum dies mit unendlichen Streams nicht möglich ist.

Wir haben gesehen, dass das Abrufen des letzten Elements ausStream im Vergleich zum Abrufen aus anderen Datenstrukturen nicht einfach ist. Dies liegt an der Faulheit vonStreams, die nur ausgewertet werden, wenn die Terminalfunktion aufgerufen wird, undwe never know if the currently evaluated element is the last one.

Code-Schnipsel könnenover on GitHub. gefunden werden