2016-05-31 146 views
2

我想用多个过滤器过滤出我的集合。Java 8 - 使用多个过滤器的过滤器集合

让我们假设我有一个字符串列表和一个函数filter()来过滤掉空的字符串。

List<String> myList = ....... 

通常情况下,我会用流是这样的:

myList.stream() 
     .filter(elem -> filterOut(elem)) 
     .collect(Collectors.toList()); 

如何使用流的集合(ListSet)应用多个过滤器?

Set<Predicate> myFilters = ..... 
+0

你可以将多个谓词通过链接它们和()函数 –

回答

2
myList.stream() 
     .filter(s -> myFilters.stream().allMatch(p -> p.test(s))) 
     .collect(Collectors.toList()); 

或者,如果你是番石榴的粉丝:

com.google.common.base.Predicate<String> combined = Predicates.and(Iterables.transform(myFilters, p -> p::test)); 
myList.stream() 
     .filter(combined::apply) 
     .collect(Collectors.toList()); 
2
Predicate combinedPredicate = myFilters.stream().reduce(Predicate::or).orElse(t -> false);