vic*_*tor 8 java lambda dictionary java-8
我是java和lambda的新手,我想在地图的地图中找到值的总和和平均值.
我的目标就像 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>>
Run Code Online (Sandbox Code Playgroud)
最终结果需要是两张地图,1表示总和,另一张表示平均值
map1 = <CountryName, SumValue>
map2 = <CountryName, AverageValue>
Run Code Online (Sandbox Code Playgroud)
所以上面例子的结果就是这样
map1 = <UK, 3.9>
<US, 6.2>
<EU, 1>
map2 = <UK, 1.3>
<US, 2.07>
<EU, 0.33>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我们的想法是流式传输内部地图的每个条目,并应用适当的收集器来计算您需要的值:
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());
Run Code Online (Sandbox Code Playgroud)
如果确实需要单独的总和和平均地图,可以从摘要地图创建它们:
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()));
Run Code Online (Sandbox Code Playgroud)
注意:我使用了以下静态导入:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summarizingDouble;
import static java.util.stream.Collectors.toMap;
| 归档时间: |
|
| 查看次数: |
3574 次 |
| 最近记录: |