编译时间:没有类型变量的实例U存在

And*_*eas 7 java java-8 java-stream

以下陈述虽然没有意义,但在语法上看起来很合理.

final Stream<LongStream> foobar = IntStream.empty()
    .flatMap(x -> IntStream.empty()
        .mapToObj(y -> IntStream.empty()
            .mapToLong(z -> 1))); //compilation error here on `z -> 1`
Run Code Online (Sandbox Code Playgroud)

但是它没有编译,返回:

java:不兼容的类型:lambda表达式中的错误返回类型没有类型变量的实例U存在以便java.util.stream.Stream符合java.util.stream.IntStream

但是,如果你延迟flatmap,一切正常:

final Stream<LongStream> foobar = IntStream.empty()
    .mapToObj(x -> IntStream.empty()
        .mapToObj(y -> IntStream.empty()
            .mapToLong(z -> 1)))
    .flatMap(x -> x);
Run Code Online (Sandbox Code Playgroud)

.mapToObj(..).flatMap(..)和刚刚有.flatMap(..)什么区别?有没有办法消除额外的flatmap调用?

4ca*_*tle 7

.mapToObj(..).flatMap(..).flatMap(..)期望完全不同的签名.

.mapToObj(..).flatMap(..)期待一个int -> Object功能和一个Object -> Stream<?>功能.

.flatMap(..)期待一个int -> IntStream功能.

如果您分解代码,则传递的int -> Stream<LongStream>函数与int -> IntStream函数不兼容.

这个简化的代码你会遇到同样的错误:

IntStream.empty().flatMap(x -> Stream.of(LongStream.empty()));
Run Code Online (Sandbox Code Playgroud)