如何将多个谓词应用于java.util.Stream's
filter()
method?
这就是我现在所做的,但我不太喜欢它。我有一个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
您始终可以使用名为的过程从中创建一个谓词减少:
Predicate<T> pred=filters.stream().reduce(Predicate::and).orElse(x->true);
or
Predicate<T> pred=filters.stream().reduce(Predicate::or).orElse(x->false);
取决于您想要如何组合过滤器。
如果在指定的空谓词集合的后备orElse
调用履行身份角色(其中x->true
做为and
ing 谓词和x->false
做为or
ing)你也可以使用reduce(x->true, Predicate::and)
or reduce(x->false, Predicate::or)
获取过滤器,但这对于非常小的集合来说效率稍低,因为它总是将恒等谓词与集合的谓词结合起来,即使它只包含一个谓词。相比之下,变体reduce(accumulator).orElse(fallback)
如果集合有大小,上面显示的将返回单个谓词1
.
请注意此模式如何适用于类似的问题:Collection<Consumer<T>>
你可以创建一个Consumer<T>
using
Consumer<T> c=consumers.stream().reduce(Consumer::andThen).orElse(x->{});
Etc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)