Java 8 JavaSE8 IntStream.reduce(..)(etc)的操作似乎不一致

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

我正在研究JavaSE8的各个方面。我遇到过许多情况,可编译代码会导致运行时异常或明显的不一致。这里有一个例子,一个构造在一个上下文中按预期运行,但在另一个上下文中似乎失败。是虫子还是我遗漏了什么

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文档中,有更多的例子和类似问题的讨论,这将非常有用。