Иногда возникает задача нахождения последнего элемента в стриме. Первый элемент можно получить с помощью метода findFirst, но как же найти последний?

Поиск последнего элемента

Для нахождения последнего элемента можно воспользоваться оператором reduce, который принимает на вход два элемента стрима и возвращает один:

public static <T> T getLastElement(Stream<T> stream) {
    return stream
            .reduce((e1, e2) -> e2)
            .orElse(null);
}

В данном случае нам нужно всегда возвращать второй аргумент их двух переданных — и, в конце концов, мы получим на выходе последний элемент. Точнее, получим Optional, который может содержать элемент или быть пустым.

Исходный код

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class GetLastElementInStream {
    public static void main(String[] args) {
        List<String> ids = Arrays.asList("111", "222", "333", "444", "555", "666", "777");
        System.out.println("Все элементы: " + ids);
        String lastElement = getLastElement(ids.stream());
        System.out.println("Последний элемент: " + lastElement);
    }

    public static <T> T getLastElement(Stream<T> stream) {
        return stream
                .reduce((e1, e2) -> e2)
                .orElse(null);
    }
}

Заключение

Для нахождения последнего элемента в стриме проще всего использовать метод reduce, который с каждой итерацией уменьшает количество элементов на 1 и в итоге мы получим последний оставшийся элемент стрима.

Нахождение последнего элемента в стриме