如果不为null,则流式传输并获取第一个对象

时间:2019-01-26 19:12:41

标签: java-8 java-stream

我正在尝试将流应用到可能为null的列表上,因为它正在调用存储库方法,并且我想从中获取第一个元素(如果它不为null)并将其参数之一与请求进行比较值。

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

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

4 个答案:

答案 0 :(得分:1)

  

如果列表不为空,我想流式传输列表并获取第一个   元素并将其参数与其他值进行比较。

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

例如,使用默认日期值:

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

答案 1 :(得分:0)

Optional<T> findFirst();,因此,如果您有nullempty流,则此方法将返回null

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

答案 2 :(得分:0)

问题是.findFirst()完全不会返回任何结果,并且.get()将失败。您可以使用.ifPresent()或使用.orElseGet()

答案 3 :(得分:0)

考虑到列表中元素的类型为ng build --prod --named-chunks --verbose --build-optimizer=false --source-map ,此代码段应满足您的需求:

YourPojo

注意:如果您使用的是Java 11或更高版本,则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 可以替换为.map(d -> d.isAfter(date))。不确定它是否更具可读性。