在Java 8中使用Lambda迭代地图吗?

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

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

数据具有格式

 <Chrome, > <Chrome, > <Chrome, > <IE, > <IE, > <IE, > <FF, > <FF, > <FF, > 

最终结果需要是两张地图,1表示总和,另一张表示平均值

 map1 =  map2 =  

所以上面例子的结果就是这样

 map1 =    map2 =    

我怎样才能做到这一点?

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

 Map 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 map1 = stats.entrySet().stream() .collect(toMap(Entry::getKey, e -> e.getValue().getSum())); Map map2 = stats.entrySet().stream() .collect(toMap(Entry::getKey, e -> e.getValue().getAverage())); 

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