繁体   English   中英

从嵌套结构中删除谓词(Google番石榴谓词)

[英]Remove predicate from nested structure (google guava predicates)

我使用谷歌番石榴谓词,我想对其进行过滤以删除其中一些。

例如此代码

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)))
);

可能吗? 如果是,怎么办?

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

事后不-的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)))
);

这意味着如果dontUseP1falsep1将像以前一样被合并到复合谓词中,但是如果为true ,它将被导致Predicates.or()alwaysFalse() )和Predicates.and()无操作谓词代替。 ( alwaysTrue() )依靠其余成分谓词的结果,使谓词等效于根本没有p1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM