Kako doći do posljednjeg elementa streama na Javi?

1. Pregled

Java Stream API je bio glavna značajka izdanja Java 8. Potoci predstavljaju lijeno procijenjene sekvence objekata i pružaju bogat, tečan i monadični API.

U ovom ćemo članku na brzinu razmotriti načine dobivanja posljednjeg elementa a Potok. Imajte na umu da zbog prirode potoka to nije prirodna operacija. Uvijek se pobrinite da ne radite s beskonačno Potoci.

2. Korištenje Smanjiti API

Smanjiti, jednostavno rečeno, smanjuje skup elemenata u a Stream na jedan element.

U ovom ćemo slučaju smanjiti skup elemenata da bismo dobili zadnji element iz Potok. Imajte na umu da ova će metoda vratiti determinističke rezultate samo za sekvencijalne Potoci.

Koristimo a Popis od Niz vrijednosti, dobiti Stream od Popis a zatim smanjite:

Popis valueList = novi ArrayList (); valueList.add ("Joe"); valueList.add ("Ivan"); valueList.add ("Sean"); Stream stream = valueList.stream (); stream.reduce ((prva, druga) -> druga) .orElse (null); 

Ovdje se tok smanjuje na razinu na kojoj mu ostaje samo posljednji element. Ako je tok prazan, vratit će a null vrijednost.

2. Korištenje funkcije preskakanja

Drugi način dobivanja posljednjeg elementa toka je preskakanjem svih elemenata prije njega. To se može postići pomoću Preskočiti funkcija Stream razred. Imajte na umu da u ovom slučaju trošimo Stream dva puta, tako da postoji jasan utjecaj na izvedbu.

Stvorimo a Popis string vrijednosti i koristite njegov veličina funkcija za određivanje koliko elemenata treba preskočiti da bi se došlo do zadnjeg elementa.

Evo primjera koda koji uzima zadnji element pomoću preskočiti:

Popis valueList = novi ArrayList (); valueList.add ("Joe"); valueList.add ("Ivan"); valueList.add ("Sean"); dugo brojanje = valueList.stream (). count (); Stream stream = valueList.stream (); stream.skip (count - 1) .findFirst (). get (); 

"Sean" završava kao posljednji element.

4. Dobivanje posljednjeg elementa beskonačnog toka

Pokušaj dobivanja posljednjeg elementa beskonačne struje doveo bi do beskonačnog slijeda vrednovanja izvedenog na beskonačnim elementima. Oba preskočiti i smanjiti neće se vratiti s izvršavanja evaluacije ukoliko ne ograničimo beskonačni tok na određeni broj elemenata koji se koriste ograničiti operacija.

Evo primjera koda gdje smo uzeli beskonačan tok i pokušali dobiti zadnji element:

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

Slijedom toga, tok se neće vratiti s procjene i završit će zaustavljanje izvršavanja programa.

5. Zaključak

Vidjeli smo različite načine za dobivanje posljednjeg elementa a Stream oboje koristeći smanjiti i Preskočiti Apis. Također smo proučavali zašto to nije moguće s beskonačnim potocima.

Vidjeli smo da je dobivanje posljednjeg elementa iz a Stream nije lako u usporedbi s dohvaćanjem iz drugih struktura podataka. To je zbog lijene prirode Potoci koji se ne vrednuju ako se ne pozove funkcija terminala i nikad ne znamo je li trenutno procijenjeni element posljednji.

Isječke koda možete pronaći na GitHubu.