RFR 8144675: Add a filtering collector
ShinyaYoshida
bitterfoxc at gmail.com
Fri Dec 4 06:57:03 UTC 2015
Hi, core-libs-dev and Brian, Paul,
I'd like to propose adding filtering method to Collectors.
When I consider the operation what is "grouping the number of employees
whose income is over 2000 by the depertment from employees", we have to
write following because there is no way to filter for Collector:
(Note: In this case, we need the entry which the value is 0)
Map<Department, Long> map = emps.stream()
.collect(groupingBy(Employee::getDepartment,
collectingAndThen(toList(),
es -> es.stream().filter(e -> e.getSalary() > 2000).count())));
When I add filtering like following to Collectors, we can write it easy,
and it would be more efficient.
public static <T, A, R>
Collector<T, ?, R> filtering(Predicate<? super T> filter,
Collector<? super T, A, R> downstream) {
BiConsumer<A, ? super T> downstreamAccumulator =
downstream.accumulator();
return new CollectorImpl<>(downstream.supplier(),
(r, t) -> {
if (filter.test(t)) {
downstreamAccumulator.accept(r,
t);
}
},
downstream.combiner(),
downstream.finisher(),
downstream.characteristics());
}
Map<Department, Long> map = emps.stream()
.collect(groupingBy(Employee::getDepartment,
filtering(e -> e.getSalary() > 2000, counting())));
Here is patch:
webrev: http://cr.openjdk.java.net/~shinyafox/8144675/webrev.00/
bugs: https://bugs.openjdk.java.net/browse/JDK-8144675
Could you consider this patch and proposal?
Regards,
shinyafox(Shinya Yoshida)
More information about the core-libs-dev
mailing list