Как да получите последния елемент на поток в Java?

1. Общ преглед

API на Java Stream беше основната характеристика на изданието на Java 8. Потоците представляват мързеливо оценени последователности от обекти и осигуряват богат, плавен и монадически API.

В тази статия ще разгледаме набързо начините за получаване на последния елемент от поток. Имайте предвид, че поради естеството на потоците това не е естествена операция . Винаги се уверявайте, че не работите с безкрайни потоци.

2. Използване на API за намаляване

Намалете , просто казано, намалява набора от елементи в поток до един елемент.

В този случай ще намалим набора от елементи, за да получим последния елемент от потока. Имайте предвид, че този метод ще върне детерминирани резултати само за последователни потоци.

Нека използваме стойности на Списък от низове , вземете потока от списъка и след това намалете:

List valueList = new ArrayList(); valueList.add("Joe"); valueList.add("John"); valueList.add("Sean"); Stream stream = valueList.stream(); stream.reduce((first, second) -> second) .orElse(null); 

Тук потокът се свежда до ниво, при което остава само последният елемент. Ако потокът е празен, той ще върне нулева стойност.

2. Използване на функцията за пропускане

Другият начин да получите последния елемент на потока е като пропуснете всички елементи преди него . Това може да се постигне с помощта на функцията Skip от клас Stream . Имайте предвид, че в този случай ние консумираме потока два пъти, така че има ясно въздействие върху производителността .

Нека създадем списък със стойности на низове и използваме неговата функция за размер, за да определим колко елемента да прескочим, за да достигнем последния елемент.

Ето примерния код за получаване на последния елемент с помощта на skip :

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(); 

„Шон“ в крайна сметка е последният елемент.

4. Получаване на последния елемент на безкраен поток

Опитът да се получи последният елемент от безкрайния поток би довел до безкрайна последователност от оценки, извършена върху безкрайни елементи. И двете пропуснете и намали няма да се върне от изпълнението на оценка, освен ако не се ограничи безкраен поток на определен брой елементи, използващи граница операция.

Ето примерния код, където взехме безкраен поток и се опитахме да получим последния елемент:

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

Следователно потокът няма да се върне от оценката и в крайна сметка ще спре изпълнението на програмата .

5. Заключение

Видяхме различни начини за получаване на последния елемент на поток, използвайки API за намаляване и пропускане . Също така разгледахме защо това не е възможно с безкрайни потоци.

Видяхме, че получаването на последния елемент от поток не е лесно в сравнение с извличането му от други структури от данни. Това се дължи на мързеливия характер на потоците, които не се оценяват, освен ако не бъде извикана терминалната функция и никога не знаем дали оцененият в момента елемент е последният.

Кодови фрагменти могат да бъдат намерени в GitHub.