簡體   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