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