将简单地图转换为地图列表

时间:2019-06-06 15:18:40

标签: java arrays lambda java-8 hashmap

我有一个Map<String, List<String>>,我需要使用lambda将其转换为Map<String, List<Map<String, String>>>。使用普通的for循环,这个问题微不足道,但是我想使用java8 lambdas来解决。

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"
    }
  ]
}

这似乎不是一个问题,不能使用lambda来解决,但我能够找到解决方法。

请提出比for循环更好的方法。

2 个答案:

答案 0 :(得分:1)

尽管理想的建议是不使用这种数据结构,但是如果要转换给定的输入,则可以尝试以下操作:

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));

答案 1 :(得分:0)

这是lambda版本代码。

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())
                ));