【问题标题】:Java 8 lambdas to find averages of list of mapsJava 8 lambdas 来查找地图列表的平均值
【发布时间】:2016-07-13 08:30:53
【问题描述】:

如何使用 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)

使用旧的好 foreachs 非常简单,我想知道是否可以使用 lambdas 来实现。我需要它的原因是我将使用 Apache Spark,而 Java-8 lambdas 将是一种更标准的方法。

【问题讨论】:

  • 您创建地图只是为了保留 2 个值吗?
  • 好吧,其实它不是map,而是scala lib的Tuple4。目前有 4 个值,所以由于即将发生的变化,情况并非如此
  • @Bogdan 为什么在使用 Scala 时要求 Java 解决方案?
  • @AndrewTobilko 关于您(已删除)的答案:它在正确的轨道上,但它必须保持运行总和和计数 n 顺序才能仅在最后进行除法。标识值为 (0.0, 0.0, 0)。这也启用了并行合并。这就是DoubleSummaryStatistics 的工作原理,尽管它更复杂,因为它使用补偿求和来提高准确性。
  • @Flown :我使用的是一些 Scalas 库,而不是 Scala

标签: java lambda java-8 java-stream


【解决方案1】:

正如Andrew Tobilko 所说,您应该使用正确的数据结构而不是Maps。

如果你坚持使用List&lt;Map&lt;&gt;&gt;,那么你需要Stream::flatMapMap::entrySet并使用正确的Collectors。


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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2018-07-12
    • 2015-05-17
    相关资源
    最近更新 更多