2 回答

TA貢獻1863條經驗 獲得超2個贊
您最需要尋找的是嵌套分組,例如:
Map<String, Map<String, List<Employee>>> groupedMap = employees.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.groupingBy(Employee::getDomain, Collectors.toList())));
注- 這些值是List<Employee>按姓名分組的員工,然后按域分組的員工。(兩者都同樣加入到一個列表中。)
如果您嚴格遵守讓單個員工與指定的分組相對應,那么只需稍作修改,代碼就對我來說非常有效:
Map<String, Map<String, Employee>> groupedReducedMap = employees.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.toMap(Employee::getDomain,
Function.identity(), // value as the employee instance
(a, b) -> a))); // choose first instance for similar 'domain'

TA貢獻1780條經驗 獲得超1個贊
由于輸出應該是Map<String, Map<String,Employee>>而不是Map<String, Map<String,List<Employee>>>(即根據您請求的輸出,不能有兩個Employee具有相同名稱和相同域的 s),您可以鏈接兩個groupingBy,然后使用它reducing來確保每個內部組將有一個Employee而不是一個List<Employee>:
Map<String, Map<String,Optional<Employee>>> output =
e.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.groupingBy(Employee::getDomain,
Collectors.reducing((x1,x2)->x2))));
這個版本的問題reducing是它返回一個Optional<Employee>而不是Employee,即使我們知道Optional永遠不會為空。
我們可以通過以下方式解決這個問題:
Map<String, Map<String,Employee>> output =
e.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.groupingBy(Employee::getDomain,
Collectors.reducing(e.get(0),
(x1,x2)->x2))));
現在,我們使用具有標識值的變體reducing,向其傳遞任意Employee實例(哪個實例并不重要,因為它總是會被正確的實例替換)。
添加回答
舉報