gpt4 book ai didi

java - 从嵌套结构中删除谓词(google guava 谓词)

转载 作者:行者123 更新时间:2023-12-01 11:31:29 25 4
gpt4 key购买 nike

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

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

为什么?我们重用了一些谓词,但有异常(exception)。

最佳答案

不是事后 - 从 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() (alwaysFalse()) 和 Predicates.and() (alwaysTrue()) 依赖于其余组件谓词的结果,使谓词相当于根本没有 p1

关于java - 从嵌套结构中删除谓词(google guava 谓词),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com