gpt4 book ai didi

Java8 - 如何将嵌套映射转换为按内部映射键值收集的嵌套映射列表

转载 作者:行者123 更新时间:2023-11-30 01:48:10 24 4
gpt4 key购买 nike

我有一个如下所示的嵌套 map 对象

{12345={{"status":"200","outcome":"Success","message":"Account created"}}
{23121={{"status":"400","outcome":"Exception","message":"Invalid State value"}}
{43563={{"status":"200","outcome":"Success","message":"Account updated"}}
{72493={{"status":"400","outcome":"Exception","message":"Bad Request"}}

我需要将其转换为 Map<String, List<Map<String, Map<String, String>>>其中外层映射的键是状态 ( 200 or 400 ) 的值该值是状态 = 200 或 400 的原始 map 列表或内部 map 中的其他有效值。

所以,新的结构看起来像

{{200={[{12345={"status":"200","outcome":"Success","message":"Account created"}},
{43563={"status":"200","outcome":"Success","message":"Account updated"}}
]
},
{400={[{23121={"status":"400","outcome":"Exception","message":"Invalid State value"}},
{72493={"status":"400","outcome":"Exception","message":"Bad Request"}}
]
}
}

最终,我需要根据不同的统计生成一份报告。

这就是我开始的地方,但我卡住了。

我想循环遍历外部 map ,获取内部 map ,获取状态键的值并根据状态代码值将 map 添加到列表中。

这就是我使用循环的方式

private static Map<String, List<Map<String, Map<String, String>>>> covertToReport(Map<String, Map<String, String>> originalMap) {
Map<String, List<Map<String, Map<String, String>>>> statusBasedListOfMaps = new TreeMap<>();
//loop through the map
//for each key, get the inner map
//get the status value for each inner map

List<Map<String, Map<String, String>>> accountsMapsList;
for (Entry<String, Map<String, String>> entry : originalMap.entrySet()) {
String accNum = entry.getKey();
Map<String, String> childMap = entry.getValue();
String stausVal = childMap.get("status");
accountsMapsList = statusBasedListOfMaps.get(stausVal) == null ? new ArrayList<>() : statusBasedListOfMaps.get(stausVal);
accountsMapsList.add((Map<String, Map<String, String>>) entry);
statusBasedListOfMaps.put(stausVal, accountsMapsList);
}
return statusBasedListOfMaps;
}

当然,下面的代码无法编译,但这就是我想要得到的。

private static void covertToReport(Map<String, Map<String, String>> originalMap) {
Map<String, List<Map<String, Map<String, String>>>> statusBasedListOfMaps;

statusBasedListOfMaps = originalMap.entrySet()
.stream()
.filter(e -> e.getValue()
.values()
.stream()
.map(innerMap -> Collectors.toList())
.collect(Collectors.toMap(Map.Entry::getKey, Collectors.toList(e)));

这可能吗?

最佳答案

您可以将Collectors.groupingBy()Collectors.mapping()结合使用:

private static Map<String, List<Map<String, Map<String, String>>>> convertToReport(Map<String, Map<String, String>> originalMap) {
return originalMap.entrySet().stream()
.collect(Collectors.groupingBy(e -> e.getValue().get("status"),
Collectors.mapping(Map::ofEntries, Collectors.toList())));
}

您可以按status进行分组,然后使用Map.ofEntries()将关联的条目映射到自己的 map 。如果您使用 Java,则可以使用它来代替 Map::ofEntries:

e -> new HashMap<>() {{ put(e.getKey(), e.getValue()); }}

结果将是这样的:

200=[
{12345={status=200, message=Account created, outcome=Success}},
{43563={status=200, message=Account created, outcome=Success}}
],
400=[
{72493={status=400, message=Invalid State value, outcome=Exception}},
{23121={status=400, message=Invalid State value, outcome=Exception}}
]

关于Java8 - 如何将嵌套映射转换为按内部映射键值收集的嵌套映射列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com