在java 8中使用group进行计数的实现

时间:2016-03-28 11:05:44

标签: java lambda java-8 java-stream

我正在寻找group by的实现,然后根据lambda表达式中的count进行过滤。

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

是否有使用lambda表达式实现此目的的简单实现。

1 个答案:

答案 0 :(得分:9)

您可以将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返回的映射的可变性,因此您可以使用重载版本并提供具体的可变实例(如果需要)。