Hvordan få det siste elementet i en strøm i Java?

1. Oversikt

Java Strøm API var den viktigste funksjonen i Java 8-utgivelsen. Strømmer representerer latevurderte sekvenser av objekter og gir et rikt, flytende og monadlignende API.

I denne artikkelen vil vi se raskt på måter å få det siste elementet i Strøm. Husk det på grunn av bekkenes natur er det ikke en naturlig operasjon. Sørg alltid for at du ikke jobber med uendelig Strømmer.

2. Bruke Redusere API

Redusere, enkelt sagt, reduserer settet med elementer i a Strøm til et enkelt element.

I dette tilfellet reduserer vi settet med elementer for å få det siste elementet fra Strøm. Husk det denne metoden vil bare returnere deterministiske resultater for sekvensiell Strømmer.

La oss bruke en Liste av String verdier, få Strøm fra Liste og reduser deretter:

List valueList = new ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); Stream stream = valueList.stream (); stream.reduce ((første, andre) -> andre) .ellerElse (null); 

Her reduseres strømmen til et nivå der den sitter igjen med bare det siste elementet. Hvis strømmen er tom, vil den returnere a null verdi.

2. Bruke hoppfunksjonen

Den andre måten å få det siste elementet i strømmen er ved å hoppe over alle elementene før den. Dette kan oppnås ved hjelp av Hopp over funksjon av Strøm klasse. Husk at i dette tilfellet bruker vi Strøm to ganger så det er en viss klar ytelsespåvirkning.

La oss lage en Liste av strengverdier og bruk dens størrelse funksjon for å bestemme hvor mange elementer du skal hoppe over for å nå det siste elementet.

Her er eksempelkoden som får det siste elementet ved hjelp av hopp over:

List valueList = new ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); lang telling = valueList.stream (). count (); Stream stream = valueList.stream (); stream.skip (count - 1) .findFirst (). get (); 

“Sean” ender opp med å bli det siste elementet.

4. Få det siste elementet i en uendelig strøm

Å prøve å få det siste elementet i den uendelige strømmen vil føre til en uendelig rekkefølge av evaluering utført på uendelige elementer. Både hopp over og redusere vil ikke komme tilbake fra gjennomføring av evaluering med mindre vi begrenser den uendelige strømmen til et bestemt antall elementer som bruker grense operasjon.

Her er eksempelkoden der vi tok en uendelig strøm og prøvde å få det siste elementet:

Stream stream = Stream.iterate (0, i -> i + 1); stream.reduce ((første, andre) -> andre) .orElse (null);

Følgelig vil ikke strømmen komme tilbake fra evalueringen, og den vil ende opp stanse gjennomføringen av programmet.

5. Konklusjon

Vi så forskjellige måter å få det siste elementet i Strøm begge bruker redusere og Hopp over APIer. Vi så også på hvorfor dette ikke er mulig med uendelige strømmer.

Vi så at det å få det siste elementet fra en Strøm er ikke lett i forhold til å hente den fra andre datastrukturer. Dette er på grunn av lat Strømmer som ikke blir evaluert med mindre terminalfunksjonen blir påkalt og vi vet aldri om det evaluerte elementet er det siste.

Kodebiter finner du på GitHub.