我认为所有使用flatMap编写的流管道都可以转换为使用mapMulti.当flatMap或mapMulti在无限流上返回/操作时,看起来我错了.
This is for educational purpose only个
当我们将一个元素映射到flatMap后面跟着limit()的无限流时,流管道是惰性的,并根据所需的元素数量进行计算.
list.stream()
.flatMap(element -> Stream.generate(() -> 1))
.limit(3)
.forEach(System.out::println);
输出:
1
1
1
但当在mapMulti中执行相同的操作时,流水线仍然是lazy,即它不会消耗无限大的流.但是当在IDE(IntelliJ)中运行它时,它挂起并且没有终止(我猜是在等待其他元素的消耗),并且没有从流流水线执行中出来.
满分是mapMulti分,
list.stream()
.mapMulti((element, consumer) -> {
Stream.generate(() -> 1)
.forEach(consumer);
})
.limit(3)
.forEach(System.out::println);
System.out.println("Done"); //Never gets here
输出:
1
1
1
但是最后一次打印(Done
)没有被执行.
这是预期中的行为吗? 我在Java中找不到关于无限流和mapMulti的任何警告或要点.