RFR 8144675: Add a filtering collector
ShinyaYoshida
bitterfoxc at gmail.com
Tue Dec 8 03:13:32 UTC 2015
Hi,
Another way have been found to satisfy the requirement(Thank you,
@gakuzzzz).
FYI, we can write it easy using toMap in this case:
Map<Department, Long> map = emps.stream()
.collect(toMap(Employee::getDepartment,
e -> e.getSalary() > 2000 ? 1L : 0L, Long::sum));
However, filtering is still necessary and useful for other situations.
Regards,
shinyafox(Shinya Yoshida)
2015-12-04 15:57 GMT+09:00 ShinyaYoshida <bitterfoxc at gmail.com>:
> 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