簡體   English   中英

使用Java中的流對對象數組進行分組並計算平均值

[英]Group and calculate average of object array using stream in Java

我有一個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屬性的子字符串分組,因此按日期分組,即4月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();
            })));

獲取每天的樣本數量:圖計數=

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的鍵(日期)對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)));

試試看

final Map<Date, Double> averageByDate = pricingSamples.stream().collect(
        Collectors.groupingBy(PricingSample::getTime, Collectors.averagingDouble(PricingSample::getAverage)));

如果您使用的是數組,請像這樣更改它,

final Map<Date, Double> averageByDate = Stream.of(pricingSamples).collect(
                Collectors.groupingBy(PricingSample::getTime, Collectors.averagingDouble(PricingSample::getAverage)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM