java - 仅当存在可选项时如何应用条件?
问题描述
我有一个Optional<LocalDate>
对象和一个Stream
其他日期。
Stream<LocalDate> dates = ...;
Optional<LocalDate> dateOptional = ...;
我想过滤掉可选之后的所有日期。如果选项不存在,过滤器不应该做任何事情。
我写了Predicate
这样的:
Predicate<LocalDate> predicate = date -> !dateOptional.isPresent() || !date.isAfter(dateOptional.get());
Stream<LocalDate> filteredStream = dates.filter(predicate);
我想避免使用isPresent()
and get()
。是否有更实用的方式来编写相同的逻辑?我正在使用 Java 8。
解决方案
关键是Predicate<T>
必须返回一个总是导致 a 的表达式boolean
。
由于您可以使用的Localdate::isAfter
回报具有内部和结果的优势:boolean
Optional
Predicate<LocalDate>
boolean
Optional<LocalDate> dateOptional = ...;
// Together Predicate<LocalDate>
Predicate<LocalDate> predicate = date -> dateOptional // .. Optional<LocalDate>
.map(d -> !date.isAfter(d)) // .. Optional<Boolean>
.orElse(true); // .. Boolean
Stream<LocalDate> filteredStream = dates.filter(predicate);
别忘了,Stream<LocalDate>
在终端操作之前,它仍然是开放的。
编辑:感谢@Holger:整体predicate
可能会被优化以避免重复和不必要的调用:
Predicate<LocalDate> predicate = dateOptional // Optional<LocalDate>
.<Predicate<LocalDate>>map(d -> date -> !date.isAfter(d)) // Optional<Predicate<LocalDate>>
.orElse(date -> true); // Predicate<LocalDate>
推荐阅读
- java - 在具有多种组合的 xml 文件中使用 PointCut 表达式
- php - 如何跳转到循环的开头?
- android - 蓝牙发现同一设备 10 次
- java - 如何将视频从我的自定义相机返回到 Messenger
- linux - 通配符作为 shell 参数
- 3d - 如何定位图层以连接 2 个点并面向相机
- python - 我的字符串索引在此密码代码中超出范围
- javascript - 如何从 javascript 客户端验证 azure blob 存储 md5 哈希?
- bash - 我可以在不连接的情况下检查服务器是否已启动?
- javascript - 使用 JavaScript Reg 为 Angular5 应用程序验证英国邮政编码