在Java 8中,根据键的部分对映射键进行分组



我有一个地图,其中包含以下信息:

"source.temp.temp1.issuer.value": "Hend",
"source.temp.temp2.issuer.value": "Ledge",
"source.temp.temp1.issuer.audence": "Legos1",
"source.temp.temp2.issuer.audence": "Legos2",
"source.temp.temp1.issuer.algp": "esc",
"source.temp.temp2.issuer.algp": "esc"

我需要根据密钥的部分进行分组,即temp1temp2等。保存它们并从中生成列表。所以最终结果应该是这样的:

[
{
"source.temp.temp1.issuer.value": "Hend",
"source.temp.temp1.issuer.audence": "Legos1",
"source.temp.temp1.issuer.algp": "esc"
},
{
"source.temp.temp2.issuer.value": "Ledge",
"source.temp.temp2.issuer.audence": "Legos2",
"source.temp.temp2.issuer.algp": "esc"
},
...
]

钥匙为Object型。

使用Stream API,您可以通过使用收集器Collectors.groupingBy()来实现。

需要作为参数传递的classifier函数将用空字符串替换"issue"之后的所有内容。默认情况下,groupingBy()将映射到同一个键的所有元素收集到一个列表中。

Map<String, String> source =
Map.of("source.temp.temp1.issuer.value", "Hend",
"source.temp.temp2.issuer.value", "Ledge",
"source.temp.temp1.issuer.audence", "Legos1",
"source.temp.temp2.issuer.audence", "Legos2",
"source.temp.temp1.issuer.algp", "esc",
"source.temp.temp2.issuer.algp", "esc");
Map<Object, List<String>> result =
source.keySet().stream()
.collect(Collectors.groupingBy(str -> str.replaceAll("\.issuer(.)*", "")));
result.entrySet().forEach(System.out::println);

输出

source.temp.temp2=[source.temp.temp2.issuer.value, source.temp.temp2.issuer.algp, source.temp.temp2.issuer.audence]
source.temp.temp1=[source.temp.temp1.issuer.algp, source.temp.temp1.issuer.audence, source.temp.temp1.issuer.value]

您可以按照此操作,在每个步骤中添加注释。

List<Map<String, String>> groups = source.entrySet().stream() //take maps entryset stream
.collect(Collectors.groupingBy(e->e.getKey().contains("temp1")?"tempKey1":"tempKey2")) //group based on your term/logic Result will be <newKey, List<Entry>>
.values().stream() //Ignore newly created key take values alone into stream again => result stream of Entry
.map(entryList-> {
return entryList.stream().collect(Collectors.toMap(e->e.getKey(), e->e.getValue()));
}) //Convert entry into Map
.collect(Collectors.toList()); //collect stream of map into List of map
System.out.println(groups);

groupingBy中,您可以根据需要更改登录名。目前我使用temp1&temp2单独使用。

最新更新