Преобразовать простую карту в карту списка карт - PullRequest
1 голос
/ 06 июня 2019

У меня есть Map<String, List<String>>, и мне нужно преобразовать его в Map<String, List<Map<String, String>>> с помощью лямбды. Используя обычный цикл for, эта проблема тривиальна, но я хочу решить ее, используя лямбда-выражения java8.

categoryToSubCat имеет тип <String, List<String>>.

Использование для циклов это преобразование:

final Map < String, List < Map < String, String >>> transformedMap = new HashMap < > ();
for (Map.Entry < String, List < String >> entry: categoryToSubCat.entrySet()) {
    final List < Map < String, String >> subCats = new ArrayList < > ();
    for (String subCat: entry.getValue()) {
        final Map < String, String > data = new HashMap < > ();
        data.put("text", subCat);
        data.put("value", subCat);
        subCats.add(data);
    }
    transformedMap.put(entry.getKey(), subCats);
}

Исходная карта содержит такие данные, как:

{
  "CAT1": [
    "CAT1-A",
    "CAT1-B"
  ],
  "CAT2": [
    "CAT2-A",
    "CAT2-B",
    "CAT2-C"
  ]
}

После преобразования оно должно стать чем-то вроде

{
  "CAT1": [
    {
      "text": "CAT1-A",
      "value": "CAT1-A"
    },
    {
      "text": "CAT1-B",
      "value": "CAT1-B"
    }
  ],
  "CAT2": [
    {
      "text": "CAT2-A",
      "value": "CAT2-A"
    },
    {
      "text": "CAT2-B",
      "value": "CAT2-B"
    },
    {
      "text": "CAT2-C",
      "value": "CAT2-C"
    }
  ]
}

Это не похоже на проблему, которую нельзя решить с помощью лямбды, но я просто могу понять, как с этим справиться.

Пожалуйста, предложите лучший подход, чем цикл for.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Хотя идеальным предложением было бы не использовать такую ​​структуру данных, тем не менее, если вы хотите преобразовать заданный вход, вы можете попробовать что-то вроде:

Map<String, List<Map<String, String>>> transformedMap = categoryToSubCat.entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
                entry -> entry.getValue()
                        .stream()
                        .map(subCat -> Map.of("text", subCat, "value", subCat))
                        .collect(Collectors.toList()), (a, b) -> b));
0 голосов
/ 06 июня 2019

Вот код лямбда-версии.

Map<String, List<Map<String, String>>> transformedMap = categoryToSubCat.keySet()
                .stream()
                .collect(Collectors.toMap(
                        //keyMapper
                        key -> key,
                        //valueMapper
                        key -> categoryToSubCat.get(key).stream().map(listStr -> {
                                    Map<String, String> map= new HashMap<>();
                                    map.put("text", listStr);
                                    map.put("value", listStr);
                                    return map;
                                }
                        ).collect(Collectors.toList())
                ));

или

Map<String, List<Map<String, String>>> transformedMap = categoryToSubCat.entrySet()
                .stream()
                .collect(Collectors.toMap(
                        //keyMapper
                        Map.Entry::getKey,
                        //valueMapper
                        entrySet -> entrySet.getValue().stream().map(listStr -> {
                                    Map<String, String> map= new HashMap<>();
                                    map.put("text", listStr);
                                    map.put("value", listStr);
                                    return map;
                                }
                        ).collect(Collectors.toList())
                ));
...