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

Java 将简单地图转换为地图列表的地图,java,arrays,lambda,java-8,hashmap,Java,Arrays,Lambda,Java 8,Hashmap,我有一个Map,我需要使用lambda将其转换为Map。使用普通for循环这个问题很简单,但我想使用java8lambdas解决它 类别子类别的类型为 使用for循环这是转换: final Map < String, List < Map < String, String >>> transformedMap = new HashMap < > (); for (Map.Entry < String, List < String >

我有一个
Map
,我需要使用lambda将其转换为
Map
。使用普通for循环这个问题很简单,但我想使用java8lambdas解决它

类别子类别
的类型为

使用for循环这是转换:

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": [
    {
      "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"
    }
  ]
}
这似乎不是一个使用lambdas无法解决的问题,但我只知道如何解决它


请建议一种比for循环更好的方法。

虽然理想的建议是不要使用这样的数据结构,但是如果要转换给定的输入,可以尝试以下方法:

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));
Map transformedMap=categoryToSubCat.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey、,
entry->entry.getValue()
.stream()
.map(subCat->map.of(“文本”,subCat,“值”,subCat))
.collect(Collectors.toList(),(a,b)->b));

这是一个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 transformedMap=categoryToSubCat.keySet()
.stream()
.collect(collector.toMap)(
//键映射器
键->键,
//值映射器
key->categoryToSubCat.get(key).stream().map(listStr->{
Map Map=newhashmap();
map.put(“text”,listStr);
map.put(“value”,listStr);
返回图;
}
).collect(收集器.toList())
));

Map transformedMap=categoryToSubCat.entrySet()
.stream()
.collect(collector.toMap)(
//键映射器
Map.Entry::getKey,
//值映射器
entrySet->entrySet.getValue().stream().map(listStr->{
Map Map=newhashmap();
map.put(“text”,listStr);
map.put(“value”,listStr);
返回图;
}
).collect(收集器.toList())
));

“请建议一种比for循环更好的方法。”-以什么方式更好?这个循环有什么问题?使用这种结构真的很难看,我建议使用类来表示数据,而不是列表和数据maps@YCF_L我同意你的观点,但在某些情况下,使用类会使代码变得不必要。我在这篇文章中没有提到,但我需要向下游发送一个json,这样类就太过了。@Nikolas一开始我把这个问题误解为按
键进行分组,然后将
文本
作为
列表
映射中的键实现并重新尝试。旁白:流的
映射
操作可以更改为
.Map(subCat->{Map data=new HashMap();data.put(“text”,subCat);data.put(“value”,subCat);返回数据;})
以实现Java-8兼容性。
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())
                ));