Joo*_*ila 1 java predicate optional java-8 java-stream
我有一个Optional<LocalDate>对象和一个Stream其他日期。
Stream<LocalDate> dates = ...;
Optional<LocalDate> dateOptional = ...;
Run Code Online (Sandbox Code Playgroud)
我想过滤掉可选的所有日期。如果可选项不存在,过滤器不应该做任何事情。
我写过Predicate这样的:
Predicate<LocalDate> predicate = date -> !dateOptional.isPresent() || !date.isAfter(dateOptional.get());
Stream<LocalDate> filteredStream = dates.filter(predicate);
Run Code Online (Sandbox Code Playgroud)
我想避免使用isPresent()和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);
Run Code Online (Sandbox Code Playgroud)
不要忘记,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>
Run Code Online (Sandbox Code Playgroud)