Группировка по значению Map в Java 8 с использованием потоков - PullRequest
0 голосов
/ 19 октября 2018

У меня есть список карты, который я хочу сгруппировать по номеру ключа, используя потоки 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())));

, но для меня это не работает

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вам просто нужно map stream, чтобы изменить формат на необходимый, а затем собрать:

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);
0 голосов
/ 19 октября 2018

Похоже, вы просто ищете:

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())));
0 голосов
/ 19 октября 2018

Если я правильно вас понял, у вас есть карты типа

{
        "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>, и вы можете легко группировать по "ном"

.collect(groupingBy(Value::getNom)
...