我使用 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)))
);
这意味着如果 dontUseP1
为 false
,则 p1
将像以前一样合并到复合谓词中,但如果它为 true
它将被替换为无操作谓词,导致 Predicates.or()
(alwaysFalse()
) 和 Predicates.and()
(alwaysTrue()
) 依赖于其余组件谓词的结果,使谓词相当于根本没有 p1
。
关于java - 从嵌套结构中删除谓词(google guava 谓词),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347730/