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