我有一个包含项目的列表,其中每个项目都是一个具有我感兴趣的 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/