Hello!

Sounds reasonable. I already have such collector in my library [1].

As an alternative solution for your problem I have groupingBy
collector with domain parameter [2], so you can specify the set of
possible keys and all keys are guaranteed to be created:

Set<Department> getAllDepartmentsSet() {...}

Map<Department, Long> map = emps.stream()
     .filter(e -> e.getSalary() > 2000)
     .collect(MoreCollectors.groupingBy(Employee::getDepartment,
         getAllDepartmentsSet(),
         counting()));

With best regards,
Tagir Valeev.

[1] 
http://amaembo.github.io/streamex/javadoc/one/util/streamex/MoreCollectors.html#filtering-java.util.function.Predicate-java.util.stream.Collector-

[2] 
http://amaembo.github.io/streamex/javadoc/one/util/streamex/MoreCollectors.html#groupingBy-java.util.function.Function-java.util.Set-java.util.stream.Collector-

S> Hi, core-libs-dev and Brian, Paul,
S> I'd like to propose adding filtering method to Collectors.

S> When I consider the operation what is "grouping the number of employees
S> whose income is over 2000 by the depertment from employees", we have to
S> write following because there is no way to filter for Collector:
S> (Note: In this case, we need the entry which the value is 0)

S> Map<Department, Long> map = emps.stream()
S>     .collect(groupingBy(Employee::getDepartment,
S>         collectingAndThen(toList(),
S>             es -> es.stream().filter(e -> e.getSalary() > 2000).count())));

S> When I add filtering like following to Collectors, we can write it easy,
S> and it would be more efficient.
S>     public static <T, A, R>
S>     Collector<T, ?, R> filtering(Predicate<? super T> filter,
S>                                Collector<? super T, A, R> downstream) {
S>         BiConsumer<A, ? super T> downstreamAccumulator =
S> downstream.accumulator();
S>         return new CollectorImpl<>(downstream.supplier(),
S>                                    (r, t) -> {
S>                                        if (filter.test(t)) {
S>                                            downstreamAccumulator.accept(r,
S> t);
S>                                        }
S>                                    },
S>                                    downstream.combiner(),
S> downstream.finisher(),
S>                                    downstream.characteristics());
S>     }

S> Map<Department, Long> map = emps.stream()
S>     .collect(groupingBy(Employee::getDepartment,
S>         filtering(e -> e.getSalary() > 2000, counting())));

S> Here is patch:
S> webrev: http://cr.openjdk.java.net/~shinyafox/8144675/webrev.00/
S> bugs: https://bugs.openjdk.java.net/browse/JDK-8144675

S> Could you consider this patch and proposal?

S> Regards,
S> shinyafox(Shinya Yoshida)

Reply via email to