gpt4 book ai didi

java - 一次性收集 Java Stream 的平均值

转载 作者:行者123 更新时间:2023-12-01 16:43:32 27 4
gpt4 key购买 nike

我正在尝试找到如何收集一个衬里中的对象列表中每个字段的平均值。

这是我正在尝试执行的操作:

public class Value {
int a;
int b;
int c;
// rest of the class
}

现在假设我有 List<Value> values = getMillionValues();

我知道要获得一个字段的平均值,我可以执行以下操作:

int averageOfA = values.stream().mapToInt(Value::getA).average()

我需要做什么才能获得每个变量上面没有重复行的所有值的平均值?

也许还有其他一些库,例如 Guava,可以帮助执行此类操作?

最佳答案

说真的,使用 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;
}
}

现在我们已经完成了样板文件(为了更好地衡量,您应该实现 hashCodeequalstoString,并添加一些 setter/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 循环。

关于java - 一次性收集 Java Stream 的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57796167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com