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 <[email protected]> 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)
