标准答案

  1. 中间操作通常惰性执行,终止操作触发遍历;短路操作可以提前结束。
  2. lambda 中修改共享集合会产生并发和可读性问题,优先使用 map、reduce 和 collector 表达结果。
  3. 并行流使用公共 ForkJoinPool,阻塞 I/O 或小数据量任务通常不适合。
  4. 需要控制线程池、超时和资源边界时,应使用显式执行器和任务模型。

题目解析

Stream 的中间操作通常惰性执行,终止操作才触发遍历;它适合把转换、过滤和聚合表达成数据流,但不会自动减少算法复杂度或提升性能。

并行流使用公共 ForkJoinPool,适合可拆分、计算密集且副作用少的工作。阻塞数据库、网络调用或小数据量任务会占用公共资源并增加调度开销。

collector 和 reduce 应表达结果,副作用要有明确同步边界。异常、取消、短路和资源关闭也要在链式表达之外保持可读和可观察。

常见误区

  • 误区:在 parallelStream 中调用阻塞数据库。改正:使用隔离且有界的执行器,或改用明确的异步任务模型。
  • 误区:在 forEach 中修改非线程安全集合。改正:使用合适 collector 或同步容器,并验证并行组合语义。
  • 误区:为了链式写法牺牲错误处理。改正:保留清晰的异常、超时、取消和资源释放边界。

作者信息