亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將列表轉換為 Map 的 Map Map<String, Map<String,Object>>

如何將列表轉換為 Map 的 Map Map<String, Map<String,Object>>

FFIVE 2023-11-01 22:46:14
我有一個List<Employee>e,我想將其轉換為 Map<String, Map<String,Emp>> 外部字符串應為“Name”而內部字符串應為“Domain”的位置。       Name Id Domaine(0) - Emp1, 1, Insurancee(1) - Emp1, 2, Salese(2) - Emp2, 3, Salese(3) - Emp4, 4, Marketing我嘗試了以下方法-e.stream().collect(Collectors.groupingBy(                                   Employee::getName,                                   toMap(Employee::getDomain,Emp)));所以預期的輸出圖應該是這樣的<Emp1>     <Insurance, e(0)>     <Sales, e(1)><Emp2>     <Sales, e(2)><Emp4>     <Marketing, e(3)>但我只得到獨特的值,實際輸出-<Emp1>     <Insurance, e(0)><Emp2>     <Sales, e(2)><Emp4>     <Marketing, e(3)>有人可以告訴最好的方法嗎?
查看完整描述

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'


查看完整回答
反對 回復 2023-11-01
?
慕神8447489

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實例(哪個實例并不重要,因為它總是會被正確的實例替換)。


查看完整回答
反對 回復 2023-11-01
  • 2 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號