gpt4 book ai didi

java - 您如何使用流操作来计算列表中值的平均值,并省略一些?

转载 作者:行者123 更新时间:2023-12-04 21:27:47 25 4
gpt4 key购买 nike

我有一个方法可以返回多个模型对象的属性平均值:

List<Activity> activities = ...;
double effortSum = 0;
double effortCount = 0;
activities.stream().forEach(a -> {
double effort = a.getEffort();
if (effort != Activity.NULL) {
effortCount++; < Compilation error, local variable
effortSum += effort; < Compilation error, local variable
}
});

但是,如前所述,上述尝试无法编译。我想到的唯一解决方案是对 Double 对象使用 AtomicReference,但这看起来很笨拙,并且给应该 是一个简单的操作。 (或者加入Guava,获得AtomicDouble,但得出的结论是一样的。)

是否有使用新的 Java 8 循环修改局部变量的“最佳实践”策略?

Activity 的相关代码:

public class Activity {
public static final double NULL = Double.MIN_VALUE;

private double effort = NULL;

public void setEffort(double effort) { this.effort = effort; }
public double getEffort() { return this.effort; }

...
}

最佳答案

Is there a "best practice" strategy for modifying local variables using the new Java 8 loops?

是的:不要。您可以修改它们的属性——尽管这仍然是一个坏主意——但您不能自己修改它们;如果变量是 final 或可能是 final,则只能从 lambda 内部引用变量。 (AtomicDouble 确实是一种解决方案,另一种是仅用作容器的 double[1]。)

这里实现“平均”操作的正确方法是

activities.stream()
.mapToDouble(Activity::getEffort)
.filter(effort -> effort != Activity.NULL)
.average()
.getAsDouble();

关于java - 您如何使用流操作来计算列表中值的平均值,并省略一些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770104/

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