2016-05-31 149 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);