如何将Guava Predicate转换为Java 8 Predicate并使用or、and、not方法
Guava Predicate 转 Java 标准库 Predicate 实现方案
核心差异说明
Java 自带的java.util.function.Predicate和Guava的Predicate核心使用区别如下:
- Guava的
Predicates.or()、Predicates.and()支持传入多个Predicate做批量逻辑判断,Java标准库的Predicate仅提供二元实例方法or()、and(),多个条件需要链式调用拼接 - Guava的
Predicates.not()对应Java 11+的静态方法Predicate.not(),Java 8环境可直接调用实例方法negate()实现取反 - 如果你的
PathSelectors.ant()方法原本返回的是Guava的com.google.common.base.Predicate,通过方法引用guavaPredicate::apply即可转成Java标准库的Predicate类型
转换后代码示例
Java 11及以上版本
import java.util.function.Predicate; class Test { private Predicate<String> getPath() { return PathSelectors.ant("/v1/*/s1/**") .or(PathSelectors.ant("/v1/*/s2/**")) .or(PathSelectors.ant("/v/*/test/*/s3/*")) .or(Predicate.not(PathSelectors.ant("/v1/*/test/*/s4/*"))) .or(PathSelectors.ant("/v1/*/test/*/s5/*/*")); } }
注意:你原代码中重复写了两次/v1/*/test/*/s5/*/*的规则,直接删除重复项即可,不影响逻辑;原代码中仅传单个参数的and()调用等价于直接使用该Predicate,如果你实际需要同时满足多个条件,按A.and(B).and(C)格式链式拼接即可。
Java 8版本
仅需修改取反逻辑即可:
.or(PathSelectors.ant("/v1/*/test/*/s4/*").negate())
多条件and示例
如果需要实现多个Predicate同时满足的逻辑,参考如下写法:
// 同时满足匹配s3、不匹配s4两个条件 Predicate<String> s3AndNotS4 = PathSelectors.ant("/v/*/test/*/s3/*") .and(Predicate.not(PathSelectors.ant("/v1/*/test/*/s4/*")));
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

