Ako získať posledný prvok streamu v Jave?

1. Prehľad

Java Prúd API bolo hlavnou vlastnosťou vydania Java 8. Prúdy predstavujú lenivo vyhodnotené sekvencie objektov a poskytujú bohaté, plynulé a monadické rozhranie API.

V tomto článku sa budeme rýchlo zaoberať spôsobmi, ako získať posledný prvok a Prúd. Pamätajte na to vzhľadom na charakter prúdov to nie je prirodzená operácia. Vždy sa uistite, že nepracujete s nekonečným Prúdy.

2. Pomocou Znížiť API

Znížiť, zjednodušene povedané, redukuje množinu prvkov v a Prúd na jeden prvok.

V tomto prípade zmenšíme množinu prvkov, aby sme získali posledný prvok z Prúd. Pamätajte na to táto metóda vráti iba deterministické výsledky za postupné Prúdy.

Použime a Zoznam z String hodnoty, získajte Prúd z Zoznam a potom znížiť:

Zoznam valueList = nový ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); Stream stream = valueList.stream (); stream.reduce ((prvý, druhý) -> druhý) .orElse (null); 

Tu sa prúd zníži na úroveň, na ktorej mu zostane iba posledný prvok. Ak je stream prázdny, vráti sa a nulový hodnotu.

2. Pomocou funkcie Preskočiť

Ďalším spôsobom, ako získať posledný prvok streamu, je preskočením všetkých prvkov pred ním. To sa dá dosiahnuť použitím Preskočiť funkcia Prúd trieda. Majte na pamäti, že v tomto prípade konzumujeme Prúd dvakrát, takže existuje jasný dopad na výkon.

Vytvorme a Zoznam reťazcových hodnôt a použiť ich veľkosť funkcia na určenie počtu prvkov, ktoré sa majú preskočiť, aby sa dosiahol posledný prvok.

Tu je príklad kódu na získanie posledného prvku pomocou preskočiť:

Zoznam valueList = nový ArrayList (); valueList.add ("Joe"); valueList.add ("John"); valueList.add ("Sean"); long count = valueList.stream (). count (); Stream stream = valueList.stream (); stream.skip (počet - 1) .findFirst (). get (); 

„Sean“ končí ako posledný prvok.

4. Získanie posledného prvku nekonečného prúdu

Pokus o získanie posledného prvku nekonečného prúdu by viedol k nekonečnému sledu vyhodnotenia vykonaného na nekonečných prvkoch. Oboje preskočiť a zmenšiť sa z vykonania vyhodnotenia nevráti, pokiaľ neobmedzíme nekonečný prúd na konkrétny počet použitých prvkov limit prevádzka.

Tu je príklad kódu, kde sme zobrali nekonečný prúd a pokúsili sa získať posledný prvok:

Stream stream = Stream.iterate (0, i -> i + 1); stream.reduce ((prvý, druhý) -> druhý) .orElse (null);

V dôsledku toho sa prúd z vyhodnotenia nevráti a skončí zastavenie vykonávania programu.

5. Záver

Videli sme rôzne spôsoby, ako získať posledný prvok a Prúd obaja používajú zmenšiť a Preskočiť API. Pozreli sme sa tiež na to, prečo to nie je možné pri nekonečných prúdoch.

Videli sme, že získanie posledného prvku z a Prúd nie je ľahké v porovnaní s načítaním z iných dátových štruktúr. Je to tak kvôli lenivej povahe Prúdy ktoré sa nevyhodnocujú, pokiaľ nie je vyvolaná funkcia terminálu a nikdy nevieme, či je momentálne hodnotený prvok posledným.

Útržky kódu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found