gpt4 book ai didi

java - 为什么 java 收集流对每个 getter 运行两次?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:10:53 24 4
gpt4 key购买 nike

我有一个包含项目的列表,其中每个项目都是一个具有我感兴趣的 getter 方法的对象。我想遍历整个列表以总结所有这些 getter 结果。

当我使用 java 8 流时,它看起来像这样:

double currentProduction = itemList.stream().collect(
Collectors.summingDouble((e) -> e.getProduction(param)));

在普通的旧 java 中,它看起来像这样:

for (Item item : itemList) {
currentProduction += item.getProduction(param);
}

这两种方法产生完全相同的结果,但我的记录器报告说,对于每个项目实例,getProduction() 方法在 java 8 流解决方案的情况下运行两次。在普通的旧 java 列表迭代解决方案中,getProduction 方法仅按预期在每个实例中运行一次。

由于 getProduction 方法的成本很高,这对我来说是个问题。

这是为什么?我能做些什么(除了只使用 for 循环)?

最佳答案

这是 Collectors.summingDouble 实现中的错误。

您可以改用 itemList.stream().mapToDouble(Class1::getProduction).sum()

错误详情:

Collector 实现的来源。

    return new CollectorImpl<>(
() -> new double[3],
(a, t) -> { sumWithCompensation(a, **mapper.applyAsDouble(t)**);
a[2] += **mapper.applyAsDouble(t)**;},
(a, b) -> { sumWithCompensation(a, b[0]);
a[2] += b[2];
return sumWithCompensation(a, b[1]); },
a -> computeFinalSum(a),
CH_NOID);

错误由** 标记。他们调用 mapper.applyAsDouble(t) 两次。

关于java - 为什么 java 收集流对每个 getter 运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238273/

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