Реализация наличия count с group by в java 8

Я ищу реализацию group by, имеющую, а затем фильтрую на основе count в лямбда-выражениях.

select COUNT(employee_id), department_id  from employee
GROUP BY department_id
HAVING COUNT(employee_id) > 1

есть ли простая реализация достижения этого с помощью лямбда-выражений.

1 ответов


вы можете комбинировать groupingBy коллектор, с counting() и collectingAndThen:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

...

Map<Long, Long> map = 
    employees.stream()
             .collect(collectingAndThen(groupingBy(Employee::getDeptId, counting()), 
                                        m -> { m.values().removeIf(v -> v <= 1L); return m; }));

обратите внимание, что здесь нет гарантии на изменчивость карты, возвращаемой groupingBy, поэтому вы можете использовать перегруженную версию и предоставить конкретный изменяемый экземпляр, если хотите.