You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:55:20