我使用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)))
);有可能吗?如果是,是如何实现的?
为什么?我们重用了一些带有异常的谓词。
发布于 2017-03-23 16:19:56
事实并非如此-从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)))
);这意味着如果dontUseP1为false,那么p1将像以前一样被合并到复合谓词中,但是如果它是true,那么它将被替换为无操作谓词,从而导致Predicates.or() (alwaysFalse())和Predicates.and() (alwaysTrue())依赖于其余组件谓词的结果,从而使该谓词等同于根本没有p1。
https://stackoverflow.com/questions/30347730
复制相似问题