写好循环的关键是确保其清晰、安全、可读、易改;应职责单一、分离数据处理与副作用、明确终止条件、避免隐式状态依赖、兼顾性能与可读性。

写好循环,关键不是“怎么让它跑起来”,而是“怎么让它不成为隐患”。高质量的循环代码,本质是清晰、安全、可读、易改——它不该靠注释解释,而应靠结构自明。
循环体必须职责单一,且逻辑内聚
一个循环里只做一件事。比如遍历订单列表计算总价,就只算总价;如果同时更新库存、发邮件、记录日志,那就违反了单一职责。这种“多任务循环”难测试、难复用、一改全崩。
- 把数据处理(如过滤、映射、聚合)和副作用操作(如写DB、发消息)彻底分开
- 优先用 Java 8+ 的 Stream API 表达意图,例如
orders.stream().filter(...).map(...).sum()比 for 循环更直白 - 若必须用传统 for 或 while,循环体内不应出现 if-else 分支嵌套超过一层
边界与终止条件必须明确、可验证
无限循环或越界访问,往往源于模糊的边界判断。高质量循环的第一道防线,就是让“什么时候停”一目了然。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 避免在 for 循环中动态修改集合大小(如边遍历边 remove),改用 Iterator.remove() 或 Collectors.partitioningBy()
- while 循环的条件表达式要原子化,不混入赋值或复杂调用,例如
while (hasNext() && !isCancelled())是安全的,while ((item = next()) != null)则隐含副作用,易出错 - 所有索引变量(如
i,index)命名需体现语义,如userIndex、retryCount,而非泛泛的i
避免隐藏状态与外部依赖干扰
循环的行为应当只取决于输入参数和自身逻辑,不能被外部变量悄悄改变,也不能反过来悄悄改坏外部状态。
立即学习“Java免费学习笔记(深入)”;
- 循环内不修改传入的原始集合或数组;如需变更,显式复制(
new ArrayList(list))或使用不可变容器 - 不在循环中调用可能抛异常但未处理的方法(如 IO、远程调用);若必须调用,应包裹在 try-catch 中,并明确失败策略(跳过?中断?重试?)
- 禁止在循环中修改控制变量以外的闭包变量,尤其是 lambda 内引用的局部变量,除非声明为 final 或 effectively final
性能与可读性兼顾,不盲目优化
提前退出、缓存长度、减少重复计算,这些不是“炫技”,而是让循环更健壮、更贴近人脑理解方式。
- 用
break或return提前结束合理场景(如找到首个匹配项),比硬跑完再取结果更自然 - for 循环中避免每次调用
list.size(),尤其对 LinkedList;提前缓存int size = list.size() - 嵌套循环要警惕圈复杂度:两层合理,三层起就要问“是否该拆成独立方法?”或“是否该换数据结构?”(如用 Map 替代 O(n²) 查找)

















