我认为所有使用flatMap编写的流管道都可以转换为使用mapMulti.当flatMapmapMulti在无限流上返回/操作时,看起来我错了.

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的任何警告或要点.

推荐答案

mapMulti()的优点在于它使用新元素,这些新元素成为流的一部分,取代了初始元素(opposed to 102 which internally generates a new stream for each element).如果要在mapMulti()中生成流,则应为consumed(i.e. executed).你创造了一股无法完全消耗的无限能量流(就像@Linocomment中指出的那样).

相反,flatMap()期望一个产生流的函数,即函数只返回它而不处理它.

以下是API note强中的一句话,强调了这两种业务之间的区别:

API Note:

此方法类似于flatMap,因为它应用一对多 对流的元素进行变换,并使结果变平 元素添加到新的流中.此方法比flatMap英寸 有下列情形的:

  • 当用少量(可能为零)的元素替换每个流元素时.使用此方法可避免创建 根据需要,为每组结果元素创建新的Stream实例 到flatMap岁.

Java相关问答推荐

如何用Java表示C++类以通过FFI使用?

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

取消按钮,但没有任何操作方法引发和异常

JavaFX Maven Assembly插件一直打包到错误的JDK版本

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

我如何知道MediaDiscoverer何时完成发现介质?

匹配一组字符或另一组字符

%This内置函数示例

如何在代码中将行呈现在矩形前面?

有效的公式或值列表必须少于或等于255个字符

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

AbstractList保证溢出到其他方法

将双倍转换为百分比

JOLT根据值删除并保留其余的json键

如何在字节数组中反转UTF-8编码?

在Java中将对象&转换为&q;HashMap(&Q)

如何设置默认序列生成器分配大小

如何在JSP中从select中获取值并将其放入另一个select

JavaFX中ListView中的问题