【问题标题】:Remove predicate from nested structure (google guava predicates)从嵌套结构中删除谓词(谷歌番石榴谓词)
【发布时间】:2015-05-20 11:00:10
【问题描述】:

我使用 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)))
);

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

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

【问题讨论】:

  • remove 是什么意思?您想重构代码,以便不使用 p1 并且代码编译正常?
  • Predicates 是某种列表,我想从列表中删除项目(如您在示例中看到的嵌套列表)。
  • Predicates 是一个 builder,其中包含一些指令。不能 100% 确定在内部它是一个列表,即使它是一个列表,这个列表也不会向公众公开,这意味着它不应该被直接访问和更改。
  • 您可能是对的,但我的问题是 - 是否可以从此构建器/列表中删除谓词?
  • 不,我不这么认为。

标签: java guava predicate


【解决方案1】:

事后并非如此 - 从 Predicates.and()Predicates.or() 返回的 Predicate 是一个黑盒,并且(根据设计)无法检查其组成部分。

正确的解决方案是重构您的代码,以便仅使用您想要的组件谓词来组合此谓词。一种选择是将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,它将被替换为导致Predicates.or() (@ 987654333@) 和 Predicates.and() (alwaysTrue()) 依赖于其余组件谓词的结果,使得谓词等同于根本没有 p1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多