簡體   English   中英

使用流在Java 8中按Map值進行分組

[英]Grouping by a Map value in Java 8 using streams

我有一個地圖列表,我想通過使用java流的鍵名稱對它進行分組。

[
      {
        "dateDebut": "2018-07-01T00:00:00.000+0000",
        "nom": "Julien Mannone",
        "etat": "Impayé"
      },
      {
        "dateDebut": "2018-08-01T00:00:00.000+0000",
        "nom": "Julien Mannone",
        "etat": "Impayé"
      },          
      {
        "dateDebut": "2018-10-01T00:00:00.000+0000",
        "nom": "Mathiew Matic",
        "etat": "payé"
      },           
      {
        "dateDebut": "2018-10-01T00:00:00.000+0000",
        "nom": "Ash Moon",
        "etat": "payé"
      }
    ]

所以我想要這樣的結果

{  
   "Julien Mannone":[  
      {  
         "dateDebut":"2018-07-01T00:00:00.000+0000",
         "etat":"Impayé"
      },
      {  
         "dateDebut":"2018-08-01T00:00:00.000+0000",
         "etat":"Impayé"
      }
   ],
   "Mathiew Matic":[  
      {  
         "dateDebut":"2018-10-01T00:00:00.000+0000",
         "etat":"payé"
      }
   ],
   "Ash Moon":[  
      {  
         "dateDebut":"2018-10-01T00:00:00.000+0000",
         "etat":"payé"
      }
   ]
}

作為使用流的初學者,我做了一些研究,我發現了一些類似的代碼

Map<String, List<Map>> afterFormatting =
        beforeFormatting.stream()
                .flatMap(m -> m.entrySet().stream())
                .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

但這對我來說不起作用

好像你只是在尋找:

Map<String, List<Map<String, String>>> afterFormatting = 
            beforeFormatting.stream()
                            .collect(Collectors.groupingBy(map -> map.get("nom")));

或者如果您不希望結果集中的每個Map<String, String>包含“nom”條目,那么您可以執行以下操作:

Map<String, List<Map<String, String>>> afterFormatting = 
     beforeFormatting.stream()
                     .collect(Collectors.groupingBy(map -> map.get("nom"), 
                           Collectors.mapping(map -> { 
                                Map<String, String> temp = new HashMap<>(map);
                                temp.remove("nom");
                               return temp;
                     }, Collectors.toList())));

如果我理解你是正確的,你有一個像這樣的地圖

{
        "dateDebut": "2018-07-01T00:00:00.000+0000",
        "nom": "Julien Mannone",
        "etat": "Impayé"
      },

但是,當你打電話的時候

.flatMap(m -> m.entrySet().stream())您將獲得所有地圖的所有條目集的流。 但實際上,你的地圖本身並不是地圖。 它們是POJO對象。

我建議創建一個類

class Value {
String dateDebut, String nom, Etring etat;
// constructor
}

然后將每個地圖轉換為此類:

beforeFormatting.stream()
.map(m-> new Value(m.get("dateDebut"), m.get("nom"),m.get("etat"))

所以現在,您有一個stream<Value> ,您可以輕松地按“nom”進行分組

.collect(groupingBy(Value::getNom)

您只需要map流以將格式更改為所需,然后收集:

list.stream().map(it -> {
                Map<String, Map<String, String>> newMap = new HashMap<>();
                String nom = it.get("nom");
                it.remove("nom");
                newMap.put(nom, it);
                return newMap;
            }
    ).collect(Collectors.toList())

可測試代碼:

    Map<String, String> m = new HashMap<>();
    m.put("dateDebut", "2018-07-01T00:00:00.000+0000");
    m.put("nom", "Julien Mannone");
    m.put("etat", "Impayé");

    Map<String, String> m2 = new HashMap<>();
    m2.put("dateDebut", "2018-10-01T00:00:00.000+0000");
    m2.put("nom", "Mathiew Matic");
    m2.put("etat", "payé");

    Map<String, String> m3 = new HashMap<>();
    m3.put("dateDebut", "2018-07-01T00:00:00.000+0000");
    m3.put("nom", "Ash Moon");
    m3.put("etat", "payé");

    List<Map<String, String>> list = new ArrayList<>();
    list.add(m);
    list.add(m2);
    list.add(m3);

    List<Map<String, Map<String, String>>> res = list.stream().map(it -> {
                Map<String, Map<String, String>> newMap = new HashMap<>();
                String nom = it.get("nom");
                it.remove("nom");
                newMap.put(nom, it);
                return newMap;
            }
    ).collect(Collectors.toList());

    System.out.println(res);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM