2 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
您最需要尋找的是嵌套分組,例如:
Map<String, Map<String, List<Employee>>> groupedMap = employees.stream()
.collect(Collectors.groupingBy(Employee::getName,
Collectors.groupingBy(Employee::getDomain, Collectors.toList())));
注- 這些值是List<Employee>按姓名分組的員工,然后按域分組的員工。(兩者都同樣加入到一個(gè)列表中。)
如果您嚴(yán)格遵守讓單個(gè)員工與指定的分組相對(duì)應(yīng),那么只需稍作修改,代碼就對(duì)我來(lái)說(shuō)非常有效:
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貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
由于輸出應(yīng)該是Map<String, Map<String,Employee>>而不是Map<String, Map<String,List<Employee>>>(即根據(jù)您請(qǐng)求的輸出,不能有兩個(gè)Employee具有相同名稱和相同域的 s),您可以鏈接兩個(gè)groupingBy,然后使用它reducing來(lái)確保每個(gè)內(nèi)部組將有一個(gè)Employee而不是一個(gè)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))));
這個(gè)版本的問(wèn)題reducing是它返回一個(gè)Optional<Employee>而不是Employee,即使我們知道Optional永遠(yuǎn)不會(huì)為空。
我們可以通過(guò)以下方式解決這個(gè)問(wèn)題:
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))));
現(xiàn)在,我們使用具有標(biāo)識(shí)值的變體reducing,向其傳遞任意Employee實(shí)例(哪個(gè)實(shí)例并不重要,因?yàn)樗偸菚?huì)被正確的實(shí)例替換)。
添加回答
舉報(bào)