我有一个浮点数的arrayList,我想对数组中的所有元素使用Math. log方法,然后将它们相加。
var doubleValue = floatArrayList.stream() .reduce( 1.0, (a, b) -> Math.log(a) + Math.log(b));
我的结果是doubleValue == NaN。我哪里做错了?
doubleValue == NaN
z2acfund1#
这可能就是你想做的。
List<Float> floats = List.of(1.f, 3.f, 2.4f, 5.7f, 10.f); float d1 = 0; for(float d : floats) { d1 += Math.log(d); } System.out.println((double)d1); double d2 = floats.stream().reduce( 0.f, (a, b) ->a + (float)Math.log(b)); double d3 = floats.stream().parallel().reduce( 0.f, (a, b) ->a + (float)Math.log(b), (threadSums, tResult)->threadSums + tResult); System.out.println(d2); System.out.println(d3);
印刷品
6.01713228225708 6.01713228225708 6.01713228225708
注意:我之前遇到的主要问题是没有意识到默认的组合器是提供的累加器。下面是源代码:
@Override public final P_OUT reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator) { return evaluate(ReduceOps.makeRef(identity, accumulator, accumulator)); }
由于提供的累加器mutates通过取log的值,它也将mutate来自线程的不同结果。
mutates
log
mutate
1条答案
按热度按时间z2acfund1#
这可能就是你想做的。
印刷品
注意:我之前遇到的主要问题是没有意识到默认的组合器是提供的累加器。下面是源代码:
由于提供的累加器
mutates
通过取log
的值,它也将mutate
来自线程的不同结果。