Java 8 lambdas用于查找地图列表的平均值

Bog*_*dan 7 java lambda java-8 java-stream

如何使用Java-8流/ lambdas,通过键找到地图列表的平均值?

例:

List<Map<String, Double>> users = Arrays.asList(
  new HashMap<String, Double>()
    {{
      put("weight", 109.0);
      put("height", 180.2);          
     }},
  new HashMap<String, Double>()
    {{
      put("weight", 59.0);
      put("height", 186.2);          
     }}
 );

 Map<String, Double> statistics = 
 //<MISSED CODE with lambdas> (?)

 System.out.println(statistics);
 //{weight=84.0, height=183.1)
Run Code Online (Sandbox Code Playgroud)

有了旧的好的foreachs它很简单,我想知道是否可以用lambdas实现.我需要它的原因是我将使用Apache Spark和Java-8 lambdas将是一个更标准的方法.

Flo*_*own 6

正如Andrew Tobilko所说,你应该使用一个合适的数据结构而不是Maps.

如果你坚持使用List<Map<>>,那么你需要Stream::flatMapMap::entrySet,并使用正确的Collector秒.


List<Map<String, Double>> users = Arrays.asList(new HashMap<String, Double>() {
  {
    put("weight", 109.0);
    put("height", 180.2);
  }
}, new HashMap<String, Double>() {
  {
    put("weight", 59.0);
    put("height", 186.2);
  }
});

Map<String, Double> statistics = users.stream().flatMap(m -> m.entrySet().stream())
    .collect(
        Collectors.groupingBy(Entry::getKey, Collectors.averagingDouble(Entry::getValue))
    );

System.out.println(statistics);
// {weight=84.0, height=183.2}
Run Code Online (Sandbox Code Playgroud)