我有一个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循环更好的方法。
答案 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())
));