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

How can I avoid using more than a single "break" statement in a loop?

出于代码质量原因,我想稍微重构一下我的代码,以便在我的循环中只使用一个 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

有什么想法吗?

谢谢。

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

您可以为中断条件定义一个变量并将其包含在 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 {
        ...
    }
}

或者在循环中声明一个局部变量,如果循环应该有一个中断,则该变量设置为 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,您选择的答案肯定是您要的答案,但从"improve the quality of code"的角度来看,这不是您应该得到的答案(毕竟,您确实将SonarQube标签添加到你的问题暗示你对代码质量感兴趣)。

您的代码片段和所选答案中的代码片段都不易于阅读和维护。主要原因是几个代码逻辑相互混合(又名。Spaghetti_code)。

如果您可以将退出条件从字符串连接逻辑中分离出来,那么问题将变得无关紧要,您的代码将更易于维护,并且既没有多重 break 语句,也没有可变的控制流变量(两者都是代码味道) .