将 Guava 谓词转换为 Java 8 谓词
Posted
技术标签:
【中文标题】将 Guava 谓词转换为 Java 8 谓词【英文标题】:Convert Guava predicate to Java 8 predicate 【发布时间】:2021-10-21 23:12:00 【问题描述】:我正在尝试将下面的代码从 Gauva 谓词转换为 java 谓词,但不知道如何应用 or,而不是 java 谓词的函数到下面的方法
import java.util.function.Predicate;
class Test
private Predicate<String> getPath()
return or(
PathSelectors.ant("/v1/*/s1/**"),
PathSelectors.ant("/v1/*/s2/**"),
and(PathSelectors.ant("/v/*/test/*/s3/*")),
not(PathSelectors.ant("/v1/*/test/*/s4/*"))),
PathSelectors.ant("/v1/*/test/*/s5/*/*"),
PathSelectors.ant("/v1/*/test/*/s5/*/*"),
);
【问题讨论】:
你的括号放错了位置,/v1/*/test/*/s5/*/*
出现了两次,否定/v1/*/test/*/s4/*
是没有意义的,因为任何指定的模式都不会包含该模式。这就像说“A 但不是 B”。通常,使用/v1/*/s[12]/**
比将/v1/*/s1/**
和/v1/*/s2/**
与or
结合使用更简单、更有效。
【参考方案1】:
Predicate
具有 and
、or
和 negate
方法,但和或仅接受一个其他谓词。您仍然可以像这样使用这些方法:
PathSelectors.ant("/v1/*/s1/**")
.or(PathSelectors.ant("/v1/*/s2/**")
.or(PathSelectors.ant("/v/*/test/*/s3/*").and(PathSelectors.ant("/v1/*/test/*/s4/*").negate()))
.or(PathSelectors.ant("/v1/*/test/*/s5/*/*")
.or(PathSelectors.ant("/v1/*/test/*/s5/*/*");
【讨论】:
以上是关于将 Guava 谓词转换为 Java 8 谓词的主要内容,如果未能解决你的问题,请参考以下文章
如何将用户输入转换为 gnu prolog 中的可重用谓词?
领域:返回 LazyFilterCollection 的谓词 - 如何转换为 Results<T>?
Google Guava:支持获取符合给定谓词的集合元素的方法?