以下语句尽管无意义,但在语法上似乎是正确的。

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

但是它不会编译,返回:



但是,如果延迟平面图,则一切正常:
final Stream<LongStream> foobar = IntStream.empty()
    .mapToObj(x -> IntStream.empty()
        .mapToObj(y -> IntStream.empty()
            .mapToLong(z -> 1)))
    .flatMap(x -> x);
.mapToObj(..).flatMap(..)和just .flatMap(..)有什么区别?有办法消除多余的平面图调用吗?

最佳答案

.mapToObj(..).flatMap(..).flatMap(..)期望完全不同的签名。
.mapToObj(..).flatMap(..)需要int -> Object函数和Object -> Stream<?>函数。
.flatMap(..)需要int -> IntStream函数。

如果分解代码,则将传递int -> Stream<LongStream>函数,该函数与int -> IntStream函数不兼容。

您将获得带有以下简化代码的same error:

IntStream.empty().flatMap(x -> Stream.of(LongStream.empty()));

10-06 16:10