Hvordan får man det sidste element i en stream i Java?

1. Oversigt

Java Strøm API var det vigtigste element i Java 8-udgivelsen. Strømme repræsenterer dovent vurderede sekvenser af objekter og tilvejebringer en rig, flydende og monadlignende API.

I denne artikel vil vi se hurtigt på måder at få det sidste element i en Strøm. Husk det på grund af strømmenes natur er det ikke en naturlig operation. Sørg altid for, at du ikke arbejder med uendelig Strømme.

2. Brug af Reducere API

Reducere, enkelt sagt, reducerer sæt af elementer i en Strøm til et enkelt element.

I dette tilfælde reducerer vi elementets sæt for at få det sidste element i Strøm. Husk det denne metode returnerer kun deterministiske resultater for sekventiel Strømme.

Lad os bruge en Liste af Snor værdier, få Strøm fra Liste og reducer derefter:

Liste valueList = ny ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); Stream stream = valueList.stream (); stream.reduce ((første, anden) -> anden) .orElse (null); 

Her reduceres strømmen til et niveau, hvor den kun har det sidste element. Hvis strømmen er tom, returnerer den a nul værdi.

2. Brug af Skip-funktionen

Den anden måde at få det sidste element i streamen er ved at springe over alle elementerne før den. Dette kan opnås ved hjælp af Springe funktion af Strøm klasse. Husk, at i dette tilfælde forbruger vi Strøm to gange, så der er en vis klar effekt på ydelsen.

Lad os oprette en Liste af strengværdier og brug dens størrelse funktion til at bestemme, hvor mange elementer der skal springes over for at nå det sidste element.

Her er eksempelkoden, der får det sidste element ved hjælp af springe:

Liste valueList = ny ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); lang optælling = valueList.stream (). count (); Stream stream = valueList.stream (); stream.skip (count - 1) .findFirst (). get (); 

“Sean” ender med at blive det sidste element.

4. Få det sidste element i en uendelig strøm

Forsøg på at få det sidste element i den uendelige strøm ville føre til en uendelig rækkefølge af evaluering udført på uendelige elementer. Begge springe og reducere kommer ikke tilbage fra udførelsen af ​​evalueringen, medmindre vi begrænser den uendelige strøm til et bestemt antal elementer, der bruger begrænse operation.

Her er eksempelkoden, hvor vi tog en uendelig strøm og forsøgte at få det sidste element:

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

Derfor kommer strømmen ikke tilbage fra evalueringen, og den ender standsning af gennemførelsen af ​​programmet.

5. Konklusion

Vi så forskellige måder at få det sidste element i Strøm begge bruger reducere og Springe API'er. Vi undersøgte også, hvorfor dette ikke er muligt med uendelige strømme.

Vi så, at få det sidste element fra en Strøm er ikke let i sammenligning med at hente det fra andre datastrukturer. Dette er på grund af Strømme som ikke evalueres, medmindre terminalfunktionen påberåbes og vi ved aldrig, om det aktuelt evaluerede element er det sidste.

Kodestykker kan findes på GitHub.