我使用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)))
);
有可能吗?如果是,怎么样?
为什么呢?我们重用了一些带有异常的谓词。
答案 0 :(得分:1)
事实并非如此 - 从Predicate
和Predicates.and()
返回的Predicates.or()
是一个黑盒子,并且(按设计)无法检查其组成部分。
正确的解决方案是重构代码,以便只使用您想要的组件谓词来组合此谓词。一种选择是将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
它将被替换使用no-op谓词导致Predicates.or()
(alwaysFalse()
)和Predicates.and()
(alwaysTrue()
)依赖于剩余组件谓词的结果,使谓词等效于没有完全p1
。