首页 > 解决方案 > 仅当存在可选项时如何应用条件?

问题描述

我有一个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。

标签: javajava-8java-streamoptionalpredicate

解决方案


关键是Predicate<T>必须返回一个总是导致 a 的表达式boolean

由于您可以使用的Localdate::isAfter回报具有内部和结果的优势:booleanOptionalPredicate<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>

推荐阅读