Поток, если не ноль, и получить первый объект - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь применить поток к списку, который может быть null, так как он вызывает метод репозитория, и я хочу получить первый элемент из него, если он не равен нулю, и сравнить один из его параметров со значением запроса.

Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
            .orElseGet(Collections::emptyList)
            .stream()
            .filter(Objects::nonNull)
            .findFirst()
            .get()
            .getPlacementDate()
            .isAfter(placementRequest.getPlacementDate())

В настоящее время происходит сбой на .get, если сам список равен null, хотя я отфильтровал с помощью nonNull. Я хочу поток список, если список не является нулевым, и получить первый элемент и сравнить его параметр с другим значением. Я пробовал с другими альтернативными фильтрами, но не повезло

Ответы [ 4 ]

0 голосов
/ 27 января 2019

Учитывая тип элементов в вашем списке YourPojo, этот фрагмент кода должен делать то, что вам нужно:

List<YourPojo> list = placementRepository.findAllByAccountId(accountId); 
LocalDate date = placementRequest.getPlacementDate();

boolean flag =
    Optional.ofNullable(list)                 // Optional<List<YourPojo>>
            .flatMap(Collection::stream)      // Stream<YourPojo>
            .filter(Objects::nonNull)         // Stream<YourPojo>
            .findFirst()                      // Optional<YourPojo>
            .map(YourPojo::getPlacementDate)  // Optional<LocalDate>
            .map(d -> d.isAfter(date))        // Optional<Boolean>
            .orElse(false);                   // Boolean 

Примечание. Если вы используете Java 11 или выше, тогда .map(d -> d.isAfter(date)) можно заменить на .map(not(date::isBefore)).Не уверен, что он более читабельный.

0 голосов
/ 26 января 2019

Дело в том, что .findFirst() не может вернуть результат вообще, а .get() не удастся. Вы можете использовать .ifPresent() или .orElseGet()

0 голосов
/ 26 января 2019

Я хочу передать список, если список не нулевой, получить первый элемент и сравнить его параметр с другим значением.

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

Например, со значением даты по умолчанию:

final LocalDate defaultDateValue = ...;

 Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
         .flatMapping(l -> l.stream()
                            .filter(Objects::nonNull)
                            .findFirst()
                            .mapping(o -> o.getPlacementDate())
          )
         .orElse(defaultDateValue)
         .isAfter(placementRequest.getPlacementDate())

При условной обработке:

Optional<LocalDate> opt = 
    Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
            .flatMapping(l -> l.stream()
                               .filter(Objects::nonNull)
                               .findFirst()
                               .mapping(o -> o.getPlacementDate())
             )

if (opt.isPresent()){          
     boolean isAfter = opt.get().isAfter(placementRequest.getPlacementDate());    
     // ...
 }
0 голосов
/ 26 января 2019

Optional<T> findFirst();, поэтому, если у вас есть поток null или empty, этот метод возвращает null.

Вы должны использовать .findFirst().orElseGet(() -> /* NULL object*/)

...