JAVA 8 Фильтр потока с использованием Predicate для получения последней записи - PullRequest
7 голосов
/ 25 мая 2020

У меня есть метод типа boolean, который возвращает поток данных типа предиката Incident, я хочу отфильтровать только последний инцидент.

public boolean hascompletededucation(LocalDate asOnDate) {
        Predicate<Courses> predicate = e -> ((e.hasincident1(asOnDate));
        return forloebs != null && forloebs.stream().anyMatch(predicate);           

Я пробовал с

return forloebs != null && forloebs.stream().filter(predicate)

примерно так, но я хочу получить последний инцидент из метода hasincident1.

метод hasincident1 выглядит следующим образом:

public boolean hasincident1(LocalDate asOnDate) {
        Predicate<Incident> completeincident= e -> !e.isCancelled() && e.isCompleted()
                && (e.getDatoHaendelse().toLocalDate().isBefore(asOnDate)
                        || e.getDateIncident().toLocalDate().isEqual(asOnDate));
        return incidentList != null && incidentList.stream().anyMatch(completeincident);
    }

Ответы [ 2 ]

4 голосов
/ 25 мая 2020

Вы должны проверить все элементы в потоке. Вы можете собрать все отфильтрованные элементы в LinkedList и получить последний.

forloebs.stream()
.filter(predicate)
.collect(Collectors.toCollection(LinkedList::new)).peekLast();

peekLast вернет null, если этот список пуст.

1 голос
/ 25 мая 2020

Вы можете использовать функцию Max, чтобы получить последний инцидент, который соответствует вашему условию completeincident.

Optional<Incident> latestIncident = forloebs.stream()
 .filter(completeincident)
 .max(Comparator.comparing(x -> x.getDateIncident()));

Компаратор сохранит последний элемент на основе getDateIncident.

Он вернет Optional.Empty, если ни один из них не соответствует критериям фильтра.

...