Java 8 - 使用多个过滤器的过滤器集合
问题描述:
我想用多个过滤器过滤出我的集合。Java 8 - 使用多个过滤器的过滤器集合
让我们假设我有一个字符串列表和一个函数filter()
来过滤掉空的字符串。
List<String> myList = .......
通常情况下,我会用流是这样的:
myList.stream()
.filter(elem -> filterOut(elem))
.collect(Collectors.toList());
如何使用流的集合(List
或Set
)应用多个过滤器?
Set<Predicate> myFilters = .....
答
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());
答
Predicate combinedPredicate = myFilters.stream().reduce(Predicate::or).orElse(t -> false);
你可以将多个谓词通过链接它们和()函数 –