Eu tenho um List<Employee>
. Agora quero resumi-los como quantos funcionários de cada faixa etária.
Como naquela lista de funcionários, há 3 funcionários com 21 anos de idade. E há 2 funcionários com 25 anos.
Então eu queria mostrá-los Map<Integer,Long>
assim
{
21:3,
25:2
}
Eu sei que posso fazer isso usando Collectors.groupingBy
. Mas por curiosidade, eu queria saber como posso usar Collectors.toMap
o método em vez disso. Eu tentei o código abaixo.
Código
@GetMapping("api/test/groupingby/age")
public Map<Integer,Long> testtest2(){
Optional<List<Employee>> optEmployees = service.getAllEmployees();
List<Employee> lsEmployees = optEmployees.map(ls->ls).orElseThrow();
lsEmployees.stream().map(emp->emp.getAge()).
collect(Collectors.
toMap(age->age, Collectors.counting(),(e1,e2)->e1,LinkedHashMap::new));
return null;
}
Está me dando o erro de tempo de compilação abaixo.
Você pode usar a
toMap
variante que aceita uma função de mesclagem:keyMapper
retorna aEmployee
idade do .valueMapper
retornos1
, de modo que na primeira vez que uma determinada chave de idade é encontrada, ela recebe o valor1
.mergeFunction
lida com o caso da mesma chave aparecendo várias vezes. Nesse caso, adicionar os valores das duas chaves idênticas garante que o mapa resultante mapeie cada idade para o número deEmployee
s com essa idade.