如何避免在循环中使用多个“break”语句?

5
为了提高代码质量,我想稍微重构一下我的代码,以便在循环中只使用一个break语句。但是我不确定我是否可以按照SonarQube的要求这样做...
以下是我的代码:
for (Integer integer: integerKey.keySet()) {
    if (map.containsKey(integerKey.get(integer))) {
        TypeValue value = map.get(integerKey.get(integer));
        sb.append(integerKey.get(integer)).append(":");
        sb.append(encodeValue(value));
        sb.append("|");
        if (integerKey.get(integer).equals(min)) {
            break;
        }
    } else if (integerKey.get(integer) <= min){
        TypeValue value = map.get(min);
        sb.append(min).append(":");
        sb.append(encodeValue(value));
        sb.append("|");
        break;
    } else {
        sb.append(integerKey.get(integer)).append(":");
        sb.append("0");
        sb.append("|");
    }
}

我希望做同样的事情,但只使用一个break,但我不确定在这种情况下是否可以仅编写一个if条件来代替if-elseif-else
有什么想法吗?
谢谢。

旁注:如果您需要键和值,则逐个迭代entrySet更为高效,因为可以避免查找(Map.get)。 - Puce
额外的注意事项:integerKey.get(integer) 可以被“缓存”,这样你就不必在每次迭代中多次查找了。最好使用 entry set,只需获取 entry 的键和值,就像 Puce 已经说过的那样。 - Thomas
3个回答

6
您可以为中断条件定义一个变量,并将其包含在for循环条件中:
boolean endLoop = false;
for (Iterator<Integer> keys = integerKey.keySet(); keys.hasNext() && !endLoop; ) {
    Integer integer = keys.next();
    if (map.containsKey(integerKey.get(integer))) {
        ...
        if (integerKey.get(integer).equals(min)) {
            endLoop = true;
        }
    } else if (integerKey.get(integer) <= min){
        ...
        endLoop = true;
    } else {
        ...
    }
}

或者在循环中声明一个本地变量,如果循环应该用 break 离开,则将其设置为 true:

for (Integer integer: integerKey.keySet()) {
    boolean endLoop = false;
    if (map.containsKey(integerKey.get(integer))) {
        ...
        if (integerKey.get(integer).equals(min)) {
            endLoop = true;
        }
    } else if (integerKey.get(integer) <= min){
        ...
        endLoop = true;
    } else {
        ...
    }
    if (endloop)
        break;
}

哦,我明白了,太好了。谢谢! - hacks4life

0
如果你想只使用一个break,那么你可以设置一个布尔变量,并在循环结束时测试它。

0
@hacks4life,你选择的答案确实是你所要求的,但从“提高代码质量”的角度来看,这并不是你应该得到的答案(毕竟,你在问题中添加了SonarQube标签,这有点暗示你对代码质量感兴趣)。
无论是你的代码片段还是所选答案中的代码都不易于阅读和维护。主要原因是几个代码逻辑混杂在一起(也就是意大利面条代码)。
如果你能将退出条件与字符串连接逻辑分开,那么这个问题就不再重要了,你的代码将更容易维护,并且既没有多个break语句,也没有可变控制流变量(这两者都是代码异味)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接