[英]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
上的中间操作(如filter
, map
, sorted
)被延迟评估; 在有像forEach
这样的终端操作之前,它们不会被应用。 在forEach
之前的filter
和map
的情况下,可以从第一个元素到最后一个元素顺序应用操作。 但是, sorted
需要先对Stream
的所有元素进行操作对其进行排序,然后才能应用forEach
。
当您在内部调用 stream 操作时,它们被称为并行线程。
当你调用 sorted() - 它在它自己的线程中进行排序,然后将结果返回到当前线程。
因此,在最后一个示例中,您执行Stream sort()和foreach()的 2 次操作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.