2016-03-28 8 views
5

Sto cercando un'implementazione di gruppo per, con e quindi filtro basato sul conteggio nelle espressioni lambda.Implementazione di contare con group by in java 8

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

Esiste una semplice implementazione del raggiungimento di questo utilizzando espressioni lambda.

risposta

6

è possibile combinare la groupingBy collettore, con counting() e 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; })); 

Si noti che qui è alcuna garanzia sulla mutevolezza della mappa restituita da groupingBy, in modo da poter utilizzare la versione di overload e fornire una concreta istanza mutevole se vuoi.

+0

Grazie per la risposta – Patan