以下语句尽管无意义,但在语法上似乎是正确的。
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()));