Java 8 JavaSE8 IntStream.reduce(..)(etc)的操作似乎不一致
我正在研究JavaSE8的各个方面。我遇到过许多情况,可编译代码会导致运行时异常或明显的不一致。这里有一个例子,一个构造在一个上下文中按预期运行,但在另一个上下文中似乎失败。是虫子还是我遗漏了什么Java 8 JavaSE8 IntStream.reduce(..)(etc)的操作似乎不一致,java-8,Java 8,我正在研究JavaSE8的各个方面。我遇到过许多情况,可编译代码会导致运行时异常或明显的不一致。这里有一个例子,一个构造在一个上下文中按预期运行,但在另一个上下文中似乎失败。是虫子还是我遗漏了什么 import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.DoubleStream; import static java.lang.System.*; public
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.DoubleStream;
import static java.lang.System.*;
public class Stream06 {
public static void main(String[] args) {
out.println(IntStream.rangeClosed(2,5)
.reduce((i,j)->i+j).getAsInt()); // OK
out.println(IntStream.rangeClosed(2,5)
.reduce(0,(i,j)->i+j)); // OK
out.println(IntStream.rangeClosed(2,5)
.reduce((i,j)->i*j).getAsInt()); // OK!
out.println(IntStream.rangeClosed(2,5)
.reduce(0,(i,j)->i*j)); // zero!!!
out.println();
out.println(LongStream.rangeClosed(2,5)
.reduce((l,m)->l+m).getAsLong()); // OK
out.println(LongStream.rangeClosed(2,5)
.reduce(0,(l,m)->l+m)); // OK
out.println(LongStream.rangeClosed(2,5)
.reduce((l,m)->l*m).getAsLong()); // OK!
out.println(LongStream.rangeClosed(2,5)
.reduce(0,(l,m)->l*m)); // zero!!!
out.println();
out.println(DoubleStream.of(2.5, 1.3, 6.8)
.reduce((d,e)->d+e).getAsDouble()); // OK
out.println(DoubleStream.of(2.5, 1.3, 6.8)
.reduce(0,(d,e)->d+e)); // OK
out.println(DoubleStream.of(2.5, 1.3, 6.8)
.reduce((d,e)->d*e).getAsDouble()); // OK (usual rounding issue)
out.println(DoubleStream.of(2.5, 1.3, 6.8)
.reduce(0,(d,e)->d*e)); // zero!!!
}
}
将i*j从零引线减少到零。。。嗯,这是意料之中的:-:标识值必须是累加器函数的标识。您是否阅读并理解了该语句?乘法的标识是1而不是0。@user3627702您遇到了哪些运行时异常?关于得到一个零的结果,其他人已经指出,如果你使用零作为单位值来减少乘法,这是意料之中的。如果你不明白这一点,也许你应该用这些术语来重述这个问题。我认为这将是一个相关的主题问题。运行时异常使用了。fromTemporalAccessor在多个上下文中,例如ZonedDateTime。FromInstant,我对文档的阅读表明它应该起作用。关于乘法的标识问题,使用1作为标识当然可以解决非空流的问题,但对于空流,1几乎肯定是一个不合适的返回值。因此,reduce的单参数版本似乎更合适,使用.orElse0访问返回的optionAgent。如果在教程中,或者最好在单个方法的API文档中,有更多的例子和类似问题的讨论,这将非常有用。