RFR 8144675: Add a filtering collector
Henry Jen
henry.jen at oracle.com
Fri Dec 4 22:25:06 UTC 2015
Uh, you did mention you need entry with value zero. I knew I miss something. :)
Cheers,
Henry
> On Dec 4, 2015, at 12:53 PM, ShinyaYoshida <bitterfoxc at gmail.com> wrote:
>
> Thank you for your comment.
>
> 2015-12-05 3:28 GMT+09:00 Henry Jen <henry.jen at oracle.com>:
> 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?
> Unfortunately, not, Stream#filter could not satisfy us in this case.
> Because when I filter before collecting, the entry which the value is 0 will not be appeared in the result map.
> Ex)
> filtering collector(Collectors#filtering): http://ideone.com/83Lzb7
> filtering before collecting(Stream#filter): http://ideone.com/EmTrXE
>
> Regards,
> shinyafox(ShinyaYoshida)
>
>
> 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