java - 从嵌套结构中删除谓词(google guava 谓词)

标签 java guava predicate

我使用 google guava 谓词,我想过滤它以便能够删除其中的一些谓词。

例如在此代码中

Predicates.or(
    Predicates.and(p1, p2, Predicates.or(p3, p4)),
    Predicates.and(p3, p2, Predicates.or(p1, p4))
    Predicates.and(p3, p2, Predicates.or(Predicates.and(p1, p2), Predicates.and(p2, p3)))
);

我想删除p1,因此结果应如下所示

Predicates.or(
    Predicates.and(p2, Predicates.or(p3, p4)),
    Predicates.and(p3, p2, Predicates.or(p4))
    Predicates.and(p3, p2, Predicates.or(Predicates.and(p2), Predicates.and(p2, p3)))
);

这可能吗?如果是,怎么办?

为什么?我们重用了一些谓词,但有异常(exception)。

最佳答案

不是事后 - 从 Predicates.and()Predicates.or() 返回的 Predicate 是一个黑盒子,并且(根据设计)无法提供检查其组成部分的方法。

正确的解决方案是重构您的代码,以便仅使用您想要的组件谓词来组成此谓词。一种选择是将 p1 替换为 alwaysTrue()alwaysFalse() 谓词,如下所示:

Predicate<T> p1OrTrue = p1;
Predicate<T> p1OrFalse = p1;
if (dontUseP1) {
  p1OrTrue = Prediactes.alwaysTrue();
  p1OrFalse = Predicates.alwaysFalse();
}

Predicates.or(
    Predicates.and(p1OrTrue, p2, Predicates.or(p3, p4)),
    Predicates.and(p3, p2, Predicates.or(p1OrFalse, p4))
    Predicates.and(p3, p2, Predicates.or(Predicates.and(p1OrTrue, p2), Predicates.and(p2, p3)))
);

这意味着如果 dontUseP1false,则 p1 将像以前一样合并到复合谓词中,但如果它为 true 它将被替换为无操作谓词,导致 Predicates.or() (alwaysFalse()) 和 Predicates.and() (alwaysTrue()) 依赖于其余组件谓词的结果,使谓词相当于根本没有 p1

关于java - 从嵌套结构中删除谓词(google guava 谓词),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347730/

相关文章:

java - 从 gwt 返回值到 javascript-jsni

java - 如何在hadoop 0.23.0 MR2上运行和编译java程序

java - 使用 Google Guava 解析日志

java - 日志记录的通用方法

java - NoSuchBeanDefinitionException : No qualifying bean of type "XInterceptor"

扩展/解析为许多注释的 Java 注释?

java - 如何用 fromNullable 包装返回可选 <T> 的方法?

java - 使用 Guava CacheBuilder/MapMaker 计算自定义缓存大小

c# - 使用 Expression 动态构建 Where 子句的 Entity Framework

java - 使用 Set<String> 和 String 作为参数创建自定义谓词