为什么在flatMap之后收集更改流处理顺序? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在flatMap之后收集更改流处理顺序? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

当我运行以下代码时:

    Stream.of("a", "b", "c")
        .flatMap(s -> Stream.of(s, s+s))
        .map(s -> {System.out.printf("complex operation on %s
", s); return s;})
        .findFirst()
        .ifPresent(s -> System.out.printf("outcome %s
", s));

... map操作为流中的前两个元素运行,而不仅仅是第一个元素:

complex operation on a
complex operation on aa
outcome a

但是,如果我在collect后明确flatMap

    Stream.of("a", "b", "c")
        .flatMap(s -> Stream.of(s, s + s))
        .collect(Collectors.toList())
        .stream()
        .map(s -> {System.out.printf("complex operation on %s
", s); return s;})
        .findFirst()
        .ifPresent(s -> System.out.printf("outcome %s
", s));

...然后map操作仅在第一个元素上运行,正如我所期望的那样。

为什么会有差异,我怎样才能让map只处理第一个项目而不收集整个传入流?

请注意,这不是我的实际代码。在实践中,我需要在filter之后和map之前的findFirst,所以我不能做像findFirst之前调用map

我也尝试过:

  • .sequential()之后的flatMap(没有效果)
  • .sorted()之后的flatMap(工作,但是读取整个流,并且在我的实际应用中它实际上没有意义排序)
答案

看起来根本原因的答案也在这里:Why filter() after flatMap() is "not completely" lazy in Java streams?

显然,这是一个已知的错误,将在Java 10中修复。请参阅JDK-8075939

以上是关于为什么在flatMap之后收集更改流处理顺序? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为什么当一个流有错误时flatMap没有输出?

用Stream流轻易的收集数据

用Stream流轻易的收集数据

Kotlin 协程Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

Kotlin 协程Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

彻底吃透java函数式编程