Wie bekomme ich das letzte Element eines Streams in Java?

1. Übersicht

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

In diesem Artikel werden wir kurz untersuchen, wie Sie das letzte Element eines Streams erhalten. Denken Sie daran, dass es sich aufgrund der Art der Streams nicht um eine natürliche Operation handelt . Stellen Sie immer sicher, dass Sie nicht mit unendlichen Streams arbeiten.

2. Verwenden der Reduce- API

Reduzieren , einfach ausgedrückt, reduziert die Menge der Elemente in einem Stream auf ein einzelnes Element.

In diesem Fall reduzieren wir die Menge der Elemente, um das letzte Element im Stream zu erhalten. Beachten Sie, dass diese Methode nur deterministische Ergebnisse für sequentielle Streams zurückgibt.

Verwenden wir eine Liste mit Zeichenfolgenwerten , holen Sie den Stream aus der Liste und reduzieren Sie 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 ein Niveau reduziert, bei dem nur noch das letzte Element übrig bleibt. Wenn der Stream leer ist, wird ein Nullwert zurückgegeben.

2. Verwenden der Sprungfunktion

Die andere Möglichkeit, das letzte Element des Streams abzurufen, besteht darin, alle Elemente davor zu überspringen . Dies kann mit der Überspringfunktion der Stream- Klasse erreicht werden. Beachten Sie, dass wir in diesem Fall den Stream zweimal verbrauchen, sodass sich deutliche Auswirkungen auf die Leistung ergeben .

Lassen Sie sich erstellen Liste von String - Werten und verwendet seine Größe Funktion , um zu bestimmen , wie viele Elemente überspringen das letzte Element zu erreichen.

Hier ist der Beispielcode, der das letzte Element mit skip 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 Stroms erhalten

Der Versuch, das letzte Element des unendlichen Stroms zu erhalten, würde zu einer unendlichen Folge von Bewertungen führen, die an unendlichen Elementen durchgeführt werden. Sowohl das Überspringen als auch das Reduzieren werden nicht von der Ausführung der Auswertung zurückkommen, es sei denn, wir beschränken den unendlichen Strom mithilfe der Grenzwertoperation auf eine bestimmte Anzahl von Elementen .

Hier ist der Beispielcode, in dem wir einen unendlichen Stream genommen und versucht haben, das letzte Element zu erhalten:

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 stoppt am Ende die Ausführung des Programms .

5. Schlussfolgerung

Wir haben verschiedene Möglichkeiten gesehen, das letzte Element eines Streams sowohl mit Reduce- als auch mit Skip- APIs abzurufen. Wir haben auch untersucht, warum dies mit unendlichen Streams nicht möglich ist.

Wir haben gesehen, dass das Abrufen des letzten Elements aus einem Stream im Vergleich zum Abrufen aus anderen Datenstrukturen nicht einfach ist. Dies liegt an der Faulheit von Streams, die nur ausgewertet werden, wenn die Terminalfunktion aufgerufen wird und wir nie wissen, ob das aktuell ausgewertete Element das letzte ist.

Code-Schnipsel finden Sie auf GitHub.