Java Stream中sorted()对forEach执行时机的影响及原因探究
Java Stream中sorted()对forEach执行时机的影响
现象差异
- 未使用
sorted()时,执行以下代码:
BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); r.lines().limit(4).forEach(System.out::println);
输入a、b、c、d时,每输入一行就会立刻打印该行。
- 添加
sorted()后,执行以下代码:
BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); r.lines().limit(4).sorted().forEach(System.out::println);
同样输入a、b、c、d时,需输入完所有4行后才会批量打印排序后的结果。
原因解析
这种差异由Stream中间操作的特性直接决定:
sorted()是有状态的中间操作,这类操作必须收集完上游所有元素才能完成自身逻辑——要完成排序,必须先拿到全部待排序的元素,才能进行比较和排序。因此它会先读取limit(4)限定的所有4行输入,完成排序后才会把元素传递给下游的forEach,所以要等输入全部完成才会打印。- 未添加
sorted()时,limit(4)是无状态的中间操作,它不需要等待所有元素,只要从上游拿到一个元素,就可以直接传递给下游的forEach。而lines()本身是懒加载的流,每读取一行输入就会生成一个元素,所以每输入一行就会被立刻处理并打印。
内容的提问来源于stack exchange,提问作者bc a
相关产品推荐
相关产品推荐

