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

时间:2015-05-20 11:00:11

标签: 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)))
);

有可能吗?如果是,怎么样?

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

1 个答案:

答案 0 :(得分:1)

事实并非如此 - 从PredicatePredicates.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)))
);

这意味着,如果dontUseP1false,那么p1将像以前一样合并到复合谓词中,但是如果它true它将被替换使用no-op谓词导致Predicates.or()alwaysFalse())和Predicates.and()alwaysTrue())依赖于剩余组件谓词的结果,使谓词等效于没有完全p1