如何以Java 8风格改写流中过滤器合取逻辑的实现代码
用Java 8风格重构Predicate合取过滤逻辑
嘿,这事儿Java 8早就给咱们准备好了更优雅的写法,不用手动写循环啦!你现在的代码是逐个遍历List<Predicate>来做合取操作(也就是所有条件都得满足),咱们可以借助Stream.reduce()和Predicate自身的方法来简化。
重构后的代码
直接把原来的filter块替换成下面这段就行:
.stream() .filter( filters.stream() .reduce(Predicate::and) .orElse(x -> true) )
逐行解释一下
filters.stream().reduce(Predicate::and):
这一步是把列表里所有的Predicate合并成一个单一的Predicate,效果就跟你手动循环里的&&逻辑完全一样——只有当所有原Predicate的test()都返回true时,合并后的Predicate才会返回true。.orElse(x -> true):
这是个安全兜底操作:如果你的filters列表是空的,reduce()会返回Optional.empty(),这时候orElse()会提供一个默认的Predicate(永远返回true),避免抛出NoSuchElementException。如果你的业务场景里filters永远不会为空,也可以直接用.get(),但我更推荐保留orElse让代码更健壮。
额外小补充
如果以后需要做析取操作(只要任意一个Predicate满足就通过),只需要把Predicate::and换成Predicate::or就行,同样的逻辑:
.filter( filters.stream() .reduce(Predicate::or) .orElse(x -> false) )
内容的提问来源于stack exchange,提问作者wykopowiedz
相关产品推荐
相关产品推荐

