说真的,使用 for 循环。
int count = 0, sumA = 0, sumB = 0, sumC = 0;
for (Value v : values) {
sumA += v.getA();
sumB += v.getB();
sumC += v.getC();
count++;
}
double avgA = ((double) sumA) / count;
double avgB = ((double) sumB) / count;
double avgC = ((double) sumC) / count;
说真的,使用上面的代码。
虽然说你应该使用上面的代码,但你可以用流来做到这一点。
您需要一些价值持有者(平均值为 double,因此您的 Value 类无法存储平均值):
class AveragesResult {
public final double a, b, c;
public AveragesResult(double a, double b, double c) {
this.a = a;
this.b = b;
this.c = c;
}
}
class AveragesIntermediate {
public final double a, b;
public AverageIntermediate(double a, double b) {
this.a = a;
this.b = b;
}
}
现在我们已经完成了样板(为了更好地衡量,您应该实现hashCode、equals 和toString,并添加一些getter),我们终于可以用简短而紧凑的方式编写流方式:
values.stream().collect(teeing(
teeing(averagingInt(Value::getA), averagingInt(Value::getB), AveragesIntermediate::new),
averagingInt(Value::getC),
(ir, avgC) -> new AveragesResult(ir.a, ir.b, avgC));
这不是很难,对吧?确保您已静态导入所有 Collector 函数(所有这些 Collectors. 看起来更丑陋)并且您使用的是 Java 12(Collectors.teeing 是 Java 12 中的新功能)。
不要使用那个,使用一个很好的旧 for 循环。