java - 在Java中使用流分组并计算对象数组的平均值

标签 java collections java-stream

我有一个 PricingSamples 对象数组:

public class PricingSample {
    private Date time;
    private Double average;

    public PricingSample(Date time, Double average) {
        this.time = time;
        this.average = average;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Double getAverage() {
        return average;
    }

    public void setAverage(Double average) {
        this.average = average;
    }
}

样本是过去一个月的每小时一次。我想计算每天的总体平均值。我能够计算流中出现的次数,也能够计算每天所有平均值的总和,我只是不知道如何将这些合并到一个流中。

这是我得到的。

对每一天的所有平均值求和(我按 Date 属性的子字符串分组,因此它按天分组,即 Thu Apr 26):

 Map<String, Double> counts = Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
            return e.getTime().toString().substring(0, 10);
        },
            Collectors.summingDouble((PricingSample e) -> {
                return e.getAverage();
            })));

获取每天的样本数: map 计数 =

Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
            return e.getTime().toString().substring(0, 10);
        },
                Collectors.counting()
            ));

最佳答案

如果你想要平均值,使用averagingDouble。这样您就不需要计算样本的总和和数量。

Map<String, Double> averages = 
    Arrays.stream(samples)
          .collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
                                         Collectors.averagingDouble(PricingSample::getAverage)));

如果您希望按键(天)对 Map 进行排序,您可以强制输出为 TreeMap:

Map<String, Double> averages = 
    Arrays.stream(samples)
          .collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
                                         TreeMap::new,
                                         Collectors.averagingDouble(PricingSample::getAverage)));

关于java - 在Java中使用流分组并计算对象数组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619213/

相关文章:

hibernate - 将同一实体作为集合映射到自身

c# - 我可以在给定对象 y 的哈希集中检索存储值 x,其中 x.Equals(y)

Java - 根据条件迭代 map 列表

java - 如何使用 Redis 和 Flask 连接 Storm 和 D3.js?

java - Facebook Graph api 通知发送抛出异常

java - Java 堆栈跟踪中的神秘位置

java - 将消息从 Java 服务器推送到 AIR 应用程序

collections - 我如何使用 Iterator 特性来构建通用 API

Java 8 基于嵌套对象属性的 pojo 过滤列表

java - 有状态和无状态 lambda 表达式有什么区别?