Stream if not null 并获取第一个对象

Stream if not null and get the first object

我正在尝试在列表上应用流,该列表可以是 null,因为它正在调用存储库方法,如果它不为空,我想从中获取第一个元素并比较它的一个参数具有请求值。

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

目前,如果列表本身是 null,则它在 .get 处失败,尽管我使用 nonNull 进行了过滤。如果列表不为空,我想流式传输列表并获取第一个元素并将其参数与其他值进行比较。我尝试了其他替代过滤器,但没有成功

Optional<T> findFirst();,所以如果你有 nullempty 流,那么这个方法 returns null.

你应该使用.findFirst().orElseGet(() -> /* NULL object*/)

问题是 .findFirst() 能够 return 没有结果,.get() 会失败。您可以使用 .ifPresent() 或使用 .orElseGet()

I want stream the list if the list is not null and get the first element and compare its parameter against other value.

您没有想到存储库返回的列表中存在空元素或空元素的情况。您必须选择一个默认值或仅当存在可选值时才执行日期比较。

例如,默认日期值:

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());    
     // ...
 }

考虑到您列表中的元素类型是 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))。不确定它是否更具可读性。