[英]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.