替换为无Java收集器。summingFloat()

替换为无Java收集器。summingFloat(),java,java-stream,Java,Java Stream,标准Java库提供了很好的用于简化的UTIL,如SummingIT、summingLong和summingDouble。不过,看起来好像没有求和浮点。是否有建议的解决方法?或者可能是因为某种原因不鼓励浮动 是否有建议的解决方法 您可以将浮点值转换为双精度,如下所示: Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum(); 或者使用reduce对浮点值求和,请注意,这将返回一个可选类型,而不是像以前的解决方案那样返回原语类型: S

标准Java库提供了很好的用于简化的UTIL,如SummingIT、summingLong和summingDouble。不过,看起来好像没有求和浮点。是否有建议的解决方法?或者可能是因为某种原因不鼓励浮动

是否有建议的解决方法

您可以将浮点值转换为双精度,如下所示:

Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
或者使用reduce对浮点值求和,请注意,这将返回一个可选类型,而不是像以前的解决方案那样返回原语类型:

Stream.of(1F, 2F, 3F).reduce(Float::sum);
float result = (float) Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
或者可能是因为某种原因不鼓励浮动

仅存在3种原始流类型的原因如下:

为了避免大量不必要的对象创建和工作,我们有三种基本流类型

也显示了类似的原因

将论点添加到问题中:

基本流之所以受到限制,主要是因为装箱开销以及为其他基本流创建专用流在很多情况下都没有那么大的用处

编辑

如注释中所述,为了避免浮点不准确,您可以在使用DoubleStream的sum后将其转换为浮点,就像第一个解决方案所做的那样:

Stream.of(1F, 2F, 3F).reduce(Float::sum);
float result = (float) Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
说明了它与简单的还原(如reduce0、Double::sum)不同之处:

有意不定义此方法的加法运算顺序,以允许实现灵活性,从而提高计算结果的速度和准确性。特别地,与简单的双值求和相比,该方法可以使用补偿求和或其他技术来实现,以减少数值求和中的误差范围

是否有建议的解决方法

您可以将浮点值转换为双精度,如下所示:

Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
或者使用reduce对浮点值求和,请注意,这将返回一个可选类型,而不是像以前的解决方案那样返回原语类型:

Stream.of(1F, 2F, 3F).reduce(Float::sum);
float result = (float) Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
或者可能是因为某种原因不鼓励浮动

仅存在3种原始流类型的原因如下:

为了避免大量不必要的对象创建和工作,我们有三种基本流类型

也显示了类似的原因

将论点添加到问题中:

基本流之所以受到限制,主要是因为装箱开销以及为其他基本流创建专用流在很多情况下都没有那么大的用处

编辑

如注释中所述,为了避免浮点不准确,您可以在使用DoubleStream的sum后将其转换为浮点,就像第一个解决方案所做的那样:

Stream.of(1F, 2F, 3F).reduce(Float::sum);
float result = (float) Stream.of(1F, 2F, 3F).mapToDouble(Float::doubleValue).sum();
说明了它与简单的还原(如reduce0、Double::sum)不同之处:

有意不定义此方法的加法运算顺序,以允许实现灵活性,从而提高计算结果的速度和准确性。特别地,与简单的双值求和相比,该方法可以使用补偿求和或其他技术来实现,以减少数值求和中的误差范围

出于某种原因不鼓励浮动吗

是的,他们被劝阻是因为他们的精度非常低,根据统计,他们的精度低至6位,从6到9位有效十进制数字

所需的额外存储通常不是问题,而精度的缺乏可能是一个巨大的问题,这可能不会出现在小型测试用例中,因此除非绝对必要,否则使用double更安全

如果流式处理的对象有一个返回浮点值的方法,并且希望对该方法的值求和,请使用Double方法将结果转换回浮点值

float sum=list.stream .collectCollectors.summingDoubleo->o.getFloat .浮动价值; 出于某种原因不鼓励浮动吗

是的,他们被劝阻是因为他们的精度非常低,根据统计,他们的精度低至6位,从6到9位有效十进制数字

所需的额外存储通常不是问题,而精度的缺乏可能是一个巨大的问题,这可能不会出现在小型测试用例中,因此除非绝对必要,否则使用double更安全

如果流式处理的对象有一个返回浮点值的方法,并且希望对该方法的值求和,请使用Double方法将结果转换回浮点值

float sum=list.stream .collectCollectors.summingDoubleo->o.getFloat .浮动价值;
不知道这是否是一个好的做法,但你可以看看收藏家。总结。。。实现并尝试自己编写类似的东西。这应该需要2分钟。或者可能出于某种原因不鼓励浮动?一般的建议是离他们远点,因为双打能提供更高的准确度,而且所需的额外内存并没有真正的区别。虽然我不确定,但我认为原因是使用双打更精确。不知道它是否是一个好的prac
不管你是否喜欢,但你可以看看收藏家。求和。。。实现并尝试自己编写类似的东西。这应该需要2分钟。或者可能出于某种原因不鼓励浮动?一般的建议是离他们远点,因为双打的准确度要高得多,而且所需的额外内存也没有什么区别。虽然我不确定,但我认为原因是使用double更为精确。使用Float::sum进行还原与双流sum中的补偿Kahan求和不同使用Float::sum进行还原与双流sum中的补偿Kahan求和不同Summing double是首选,因为它试图通过补偿求和提高精度首选,因为它试图通过补偿求和提高精度。