首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从嵌套结构中删除谓词(google guava谓词)

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

Stack Overflow用户
提问于 2015-05-20 19:00:11
回答 1查看 110关注 0票数 0

我使用google guava谓词,并希望对其进行过滤,以便能够删除其中的一些谓词。

例如在下面的代码中

代码语言:javascript
复制
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,因此结果应该如下所示

代码语言:javascript
复制
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)))
);

有可能吗?如果是,是如何实现的?

为什么?我们重用了一些带有异常的谓词。

EN

回答 1

Stack Overflow用户

发布于 2017-03-23 16:19:56

事实并非如此-从Predicates.and()Predicates.or()返回的Predicate是一个黑盒,并且(根据设计)没有提供检查其组件的方法。

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30347730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档