1 回答
TA贡献1866条经验 获得超5个赞
说真的,使用 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;
说真的,使用上面的代码。
话虽如此,您应该使用上面的代码,但您可以使用流来完成。
您需要一些值持有者(平均值是 a 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、equalsand 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.)并且您使用的Collectors.teeing是 Java 12(Java 12 中的新增功能)。
不要使用它,使用一个好的旧for循环。
添加回答
举报