gpt4 book ai didi

java - 在 Java 8 中按 map 列表分组

转载 作者:搜寻专家 更新时间:2023-10-30 19:58:46 28 4
gpt4 key购买 nike

我有一个这样的列表:

List<Map<String, Long>>

有没有办法使用 lambda 将此列表转换为:

Map<String, List<Long>>

示例:

Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1);
m1.put("B", 100);

Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10);
m2.put("B", 20);
m2.put("C", 100);

List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);

格式化后:

Map<String, List<Long>> afterFormatting;

看起来像:

A -> [1, 10]
B -> [100, 20]
C -> [100]

最佳答案

您需要 flatMap每个 Map 的条目集创建一个 Stream<Map.Entry<String, Long>> .然后,可以使用 groupingBy(classifier, downstream) 收集此流收集器:分类器返回条目的键,下游收集器将条目映射到它的值并将其收集到 List 中。 .

Map<String, List<Long>> map = 
list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

此代码需要以下静态导入:

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;

用你的完整例子:

public static void main(String[] args) {
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1l);
m1.put("B", 100l);

Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10l);
m2.put("B", 20l);
m2.put("C", 100l);

List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);

Map<String, List<Long>> afterFormatting =
beforeFormatting.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]}
}

关于java - 在 Java 8 中按 map 列表分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174527/

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