
本文介绍如何用简洁的三元运算符替代重复的左右遍历方法,仅用一个通用循环结构封装 goLeft 和 goRight 的共性逻辑,消除代码冗余,提升可维护性。
本文介绍如何用简洁的三元运算符替代重复的左右遍历方法,仅用一个通用循环结构封装 `goleft` 和 `goright` 的共性逻辑,消除代码冗余,提升可维护性。
在实际开发中,我们常遇到“方向相反但逻辑高度一致”的遍历场景——例如从某索引向左(递减)或向右(递增)扫描数组,核心处理逻辑完全相同,仅循环终止条件不同。此时若分别编写 goLeft 和 goRight 两个方法,不仅违反 DRY(Don’t Repeat Yourself)原则,还增加测试与维护成本。
最佳实践是提取共性,将方向逻辑内聚于循环条件中。无需引入额外的函数式接口(如 BiPredicate
void goInDirection(int number, int index, int increment, int to) {
int localMax = 0;
int i = index;
// 统一循环:根据 increment 正负自动适配终止条件
while (increment < 0 ? i > to : i < to) {
i += increment;
// ✅ 公共主体逻辑(例如:更新 localMax、校验边界、收集结果等)
if (i >= 0 && i < array.length) {
localMax = Math.max(localMax, array[i]);
}
}
}✅ 调用示例:
- 向左遍历(到索引 -1 停止):goInDirection(42, 5, -1, -1) → 等价原 goLeft
- 向右遍历(到索引 array.length 停止):goInDirection(42, 5, 1, array.length) → 等价原 goRight
⚠️ 注意事项:
- increment 必须严格为 +1 或 -1(或其他非零整数),且其符号需与 to 的相对位置语义一致;
- 若需支持更复杂的终止逻辑(如“直到遇到特定值”),才应考虑 BiPredicate
+ Function 组合,但本例纯数值边界场景下,三元运算符更轻量、高效、易读; - 循环体内务必保留必要的边界检查(如 i 是否越界),避免因 increment 异常导致无限循环。
总结:面对方向性遍历的重复代码,优先使用语义清晰、零开销的条件表达式进行抽象;函数式接口虽强大,但不是银弹——简单问题用简单解法,才是专业工程的体现。









