繁体   English   中英

stream 流水线时 stream.sorted() 如何工作?

[英]How stream.sorted() works when pipelining a stream?

以下代码执行时

Stream<Integer> intStream = Stream.of(10,2,7);
Stream<Integer> intStream2 = intStream.filter(n -> { System.out.println("Filtering Current Element: "+n); return n % 2 == 0; });
Stream<Integer> intStream3 = intStream2.map(n -> { System.out.println("Mapping Current Element: "+n); return n * n * n; });
intStream3.forEach(a->System.out.println(a));

给出 output 为

Filtering Current Element: 10
Mapping Current Element: 10
1000
Filtering Current Element: 2
Mapping Current Element: 2
8
Filtering Current Element: 7

但是当 sorted 用于两者之间

Stream<Integer> intStream = Stream.of(10,2,7);
Stream<Integer> intStream2 = intStream.filter(n -> { System.out.println("Filtering Current Element: "+n); return n % 2 == 0; });
Stream<Integer> intStream3 = intStream2.map(n -> { System.out.println("Mapping Current Element: "+n); return n * n * n; });
intStream3.sorted().forEach(a->System.out.println(a));

output是这里

Filtering Current Element: 10
Mapping Current Element: 10
Filtering Current Element: 2
Mapping Current Element: 2
Filtering Current Element: 7
8
1000

有人可以解释 stream 如何流经这条管道吗?

Stream上的中间操作(如filtermapsorted )被延迟评估; 在有像forEach这样的终端操作之前,它们不会被应用。 forEach之前的filtermap的情况下,可以从第一个元素到最后一个元素顺序应用操作。 但是, sorted需要先对Stream的所有元素进行操作对其进行排序,然后才能应用forEach

当您在内部调用 stream 操作时,它们被称为并行线程。

当你调用 sorted() - 它在它自己的线程中进行排序,然后将结果返回到当前线程。

因此,在最后一个示例中,您执行Stream sort()foreach()的 2 次操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM