【发布时间】:2014-08-24 13:56:29
【问题描述】:
如何将多个谓词应用于java.util.Stream's 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());
但是如何在不混合编程风格的情况下应用未知数量的谓词?要知道它看起来有点丑......
【问题讨论】:
-
@A4L:这不是重复的,我问的是当你不知道会有多少过滤器时如何使用多个过滤器。如果只是一两,我已经知道答案了。
-
您可以在循环中使用
.or构建复合过滤器。 -
如何创建谓词列表?你不能用
Predicate<Thing> allPredicates之类的东西代替allPredicates.and(predicate);或allPredicates.or(predicate);添加其他谓词,然后在filter中使用allPredicates吗? -
@Pshemo:这正是我要问的。如何即时创建?我将有一个由类的外部消费者创建的谓词列表,我需要创建某种超级谓词。这就是我实际所做的,但看起来不太好。
标签: java lambda java-8 java-stream predicate