[英]Google Guava Predicates.or() or Predicates.and() type
[英]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)))
);
这意味着如果dontUseP1
为false
则p1
将像以前一样被合并到复合谓词中,但是如果为true
,它将被导致Predicates.or()
( alwaysFalse()
)和Predicates.and()
无操作谓词代替。 ( alwaysTrue()
)依靠其余成分谓词的结果,使谓词等效于根本没有p1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.