标准答案
- 中间操作通常惰性执行,终止操作触发遍历;短路操作可以提前结束。
- lambda 中修改共享集合会产生并发和可读性问题,优先使用 map、reduce 和 collector 表达结果。
- 并行流使用公共 ForkJoinPool,阻塞 I/O 或小数据量任务通常不适合。
- 需要控制线程池、超时和资源边界时,应使用显式执行器和任务模型。
题目解析
Stream 的中间操作通常惰性执行,终止操作才触发遍历;它适合把转换、过滤和聚合表达成数据流,但不会自动减少算法复杂度或提升性能。
并行流使用公共 ForkJoinPool,适合可拆分、计算密集且副作用少的工作。阻塞数据库、网络调用或小数据量任务会占用公共资源并增加调度开销。
collector 和 reduce 应表达结果,副作用要有明确同步边界。异常、取消、短路和资源关闭也要在链式表达之外保持可读和可观察。
常见误区
- 误区:在 parallelStream 中调用阻塞数据库。改正:使用隔离且有界的执行器,或改用明确的异步任务模型。
- 误区:在 forEach 中修改非线程安全集合。改正:使用合适 collector 或同步容器,并验证并行组合语义。
- 误区:为了链式写法牺牲错误处理。改正:保留清晰的异常、超时、取消和资源释放边界。