RFR 8144675: Add a filtering collector

Henry Jen henry.jen at oracle.com
Fri Dec 4 18:28:51 UTC 2015


My first thought is what’s wrong with

stream.filter(predicate).collect(...)?

In your case, that would be,

amps.stream().filter(e -> e.getSalary() > 2000)
.collect(groupingBy(Employee::getDepartment), Collectors.counting())

That should work just fine?

Cheers,
Henry



> On Dec 3, 2015, at 10:57 PM, ShinyaYoshida <bitterfoxc at gmail.com> wrote:
> 
> 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