gpt4 book ai didi

java - 如何将多个谓词应用于 java.util.Stream?

转载 作者:IT老高 更新时间:2023-10-28 20:34:16 26 4
gpt4 key购买 nike

如何将多个谓词应用于 java.util.Stream 的 filter() 方法?

这就是我现在所做的,但我不太喜欢它。我有一个 Collection 事物,我需要根据过滤器(谓词)的 Collection 减少事物的数量:

Collection<Thing> things = someGenerator.someMethod();
List<Thing> filtered = things.parallelStream().filter(p -> {
for (Filter f : filtersCollection) {
if (f.test(p))
return true;
}
return false;
}).collect(Collectors.toList());

我知道,如果我预先知道过滤器的数量,我可以这样做:

List<Thing> filtered = things.parallelStream().filter(filter1).or(filter2).or(filter3)).collect(Collectors.toList());

但是如何在不混合编程风格的情况下应用未知数量的谓词?要知道它看起来有点丑......

最佳答案

如果您有 Collection<Predicate<T>> filters您始终可以使用称为 reduction 的过程从中创建单个谓词:

Predicate<T> pred=filters.stream().reduce(Predicate::and).orElse(x->true);

Predicate<T> pred=filters.stream().reduce(Predicate::or).orElse(x->false);

取决于您希望如何组合过滤器。

如果 orElse 中指定的空谓词集合的回退call 满足身份角色(x->trueand 执行谓词,x->falseor 执行)您也可以使用 reduce(x->true, Predicate::and)reduce(x->false, Predicate::or)获取过滤器,但对于非常小的集合来说效率稍低,因为它总是将标识谓词与集合的谓词结合起来,即使它只包含一个谓词。相比之下,变体 reduce(accumulator).orElse(fallback)如果集合的大小为 1,则上面显示的将返回单个谓词.


请注意此模式如何适用于类似的问题:拥有 Collection<Consumer<T>>您可以创建一个 Consumer<T>使用

Consumer<T> c=consumers.stream().reduce(Consumer::andThen).orElse(x->{});

等等

关于java - 如何将多个谓词应用于 java.util.Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24553761/

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