如何将过滤器集合应用于 Java 流?
How to apply a collection of filters to a Java stream?
如何将一组谓词应用于 Java 流?
下面的代码将说明我的想法:
final Collection<Predicate<MyObject>> filters = getFilters();
final Stream<MyObject> oStream = getMyObjectStream();
oStream
.filterAll(filters) // <- this one doesn't exist
.forEach(System.out::println);
我目前正在使用带有经典循环的函数 .filter(m -> applyAllFilters(m, filters))
,但想知道是否有更“流畅”的方式?
boolean applyAllFilters(final MyObject m, final Collection<Predicate<MyObject>> filters) {
Iterator Predicate<MyObject> iter = filters.iterator();
while(iter.hasNext()) {
Predicate<MyObject> p = iter.next();
if (!p.test(m)) {
return false;
}
}
return true;
}
您可以简单地将所有谓词简化为一个与所有谓词相加的单个谓词,如下所示:
oStream
.filter(filters.stream().reduce(Predicate::and).orElseThrow())
.forEach(System.out::println);
或者,如果您希望过滤器列表在某些情况下为空,您可以这样做:
oStream
.filter(filters.stream().reduce(o -> true, Predicate::and))
.forEach(System.out::println);
您可以使用循环来应用过滤器:
final Collection<Predicate<MyObject>> filters = getFilters();
Stream<MyObject> oStream = getMyObjectStream();
for(Predicate<MyObject> p : filters) {
oStream = oStream.filter(p);
}
oStream.forEach(System.out::println);
您可以预先创建一个满足所有条件的过滤器。
假设您有三个 Predicate <MyObject> a, b, c
。无论oStream
.
如何,这些都可以组合如下
Predicate<MyObject> allFilter = e -> a.test(e) && b.test(e) && c.test(e);
所以你可以这样做。
Predicate<MyObject> filterAll = filters.stream()
.reduce(Predicate::and).orElse(e -> true);
oStream
.filter(filterAll)
.forEach(System.out::println);
如何将一组谓词应用于 Java 流?
下面的代码将说明我的想法:
final Collection<Predicate<MyObject>> filters = getFilters();
final Stream<MyObject> oStream = getMyObjectStream();
oStream
.filterAll(filters) // <- this one doesn't exist
.forEach(System.out::println);
我目前正在使用带有经典循环的函数 .filter(m -> applyAllFilters(m, filters))
,但想知道是否有更“流畅”的方式?
boolean applyAllFilters(final MyObject m, final Collection<Predicate<MyObject>> filters) {
Iterator Predicate<MyObject> iter = filters.iterator();
while(iter.hasNext()) {
Predicate<MyObject> p = iter.next();
if (!p.test(m)) {
return false;
}
}
return true;
}
您可以简单地将所有谓词简化为一个与所有谓词相加的单个谓词,如下所示:
oStream
.filter(filters.stream().reduce(Predicate::and).orElseThrow())
.forEach(System.out::println);
或者,如果您希望过滤器列表在某些情况下为空,您可以这样做:
oStream
.filter(filters.stream().reduce(o -> true, Predicate::and))
.forEach(System.out::println);
您可以使用循环来应用过滤器:
final Collection<Predicate<MyObject>> filters = getFilters();
Stream<MyObject> oStream = getMyObjectStream();
for(Predicate<MyObject> p : filters) {
oStream = oStream.filter(p);
}
oStream.forEach(System.out::println);
您可以预先创建一个满足所有条件的过滤器。
假设您有三个 Predicate <MyObject> a, b, c
。无论oStream
.
Predicate<MyObject> allFilter = e -> a.test(e) && b.test(e) && c.test(e);
所以你可以这样做。
Predicate<MyObject> filterAll = filters.stream()
.reduce(Predicate::and).orElse(e -> true);
oStream
.filter(filterAll)
.forEach(System.out::println);