我正在尝试将流应用到可能为null
的列表上,因为它正在调用存储库方法,并且我想从中获取第一个元素(如果它不为null)并将其参数之一与请求进行比较值。
Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.findFirst()
.get()
.getPlacementDate()
.isAfter(placementRequest.getPlacementDate())
尽管我使用nonNull进行了过滤,但如果列表本身为.get
,则当前失败null
。如果列表不为空,我想流式列表,并获取第一个元素并将其参数与其他值进行比较。我尝试了其他替代过滤器,但没有运气
答案 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();
,因此,如果您有null
或empty
流,则此方法将返回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))
。不确定它是否更具可读性。