Как вернуть только одну строку из потока Java - PullRequest
0 голосов
/ 09 ноября 2018

Я понимаю, как собрать до List, но не могу понять как бы я вернул только один параметр фильтруемого объекта как String.

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))

    return fee;

Сначала я проверяю, что сбор актуален, так как могут быть предстоящие сборы и сборы, которые больше не действительны Затем я сопоставляю идентификатор с оставшимися платежами. Но тогда между последним фильтром и возвратом отсутствует код.

Я просто хочу вернуть String из Stream объекта (p.getFee) для BigDecimal конструктора.

Я знаю, что после фильтров остался только один Stream объект.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Может быть, это был бы лучший подход:

fee = fees.stream()
        .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
        .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
        .filter(p -> p.getId().equals(id))
        .map(p -> p.getFee())
        .findFirst()
        .map(BigDecimal::new)
        .orElse(/*some default value*/);
0 голосов
/ 09 ноября 2018

Используйте findFirst, чтобы вернуть первый элемент Stream, который проходит через ваши фильтры. Он возвращает Optional, поэтому вы можете использовать orElse() для установки значения по умолчанию, если Stream пусто.

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))
            .map(p -> p.getFee())
            .findFirst()
            .orElse(/*some default value*/));
...