gpt4 book ai didi

java - 在 Java 8 中使用 Lambda 遍历一个 Map of Maps?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:29 25 4
gpt4 key购买 nike

我是 java 和 lambda 的新手,我想在 map 的 map 中找到值的总和和平均值。

我的对象就像Map<String, Map<String, Double>> browserData;

数据格式

<Chrome, <UK, 2.90>>
<Chrome, <US, 5.20>>
<Chrome, <EU, -0.25>>
<IE, <UK, 0.1>>
<IE, <US, -.20>>
<IE, <EU, 0.00>>
<FF, <UK, 0.90>>
<FF, <US, 1.20>>
<FF, <EU, 1.25>>

最终的结果需要两张图,一张求和,一张求平均值

map1 = <CountryName, SumValue>

map2 = <CountryName, AverageValue>

所以上面例子的结果应该是

map1 = <UK, 3.9>
<US, 6.2>
<EU, 1>

map2 = <UK, 1.3>
<US, 2.07>
<EU, 0.33>

我怎样才能做到这一点?

最佳答案

想法是流式传输内部映射的每个条目并应用适当的收集器来计算您需要的值:

Map<String, DoubleSummaryStatistics> stats = browserData.values().stream()
.flatMap(m -> m.entrySet().stream()) //Stream the inner maps' entrySets
.collect(groupingBy(Entry::getKey, summarizingDouble(Entry::getValue)));
DoubleSummaryStatistics ds = stats.getOrDefault("EU", new DoubleSummaryStatistics());
System.out.println("sumEu = " + ds.getSum());
System.out.println("avgEu = " + ds.getAverage());

如果您确实需要单独的总和图和平均图,您可以从汇总图创建它们:

Map<String, Double> map1 = stats.entrySet().stream()
.collect(toMap(Entry::getKey, e -> e.getValue().getSum()));
Map<String, Double> map2 = stats.entrySet().stream()
.collect(toMap(Entry::getKey, e -> e.getValue().getAverage()));

注意:我使用了以下静态导入:
导入静态 java.util.stream.Collectors.groupingBy;
导入静态 java.util.stream.Collectors.summarizingDouble;
导入静态 java.util.stream.Collectors.toMap;

关于java - 在 Java 8 中使用 Lambda 遍历一个 Map of Maps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25864559/

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