【问题标题】:Is there any cleaner way to write multiple if-statements in Java有没有更简洁的方法可以在 Java 中编写多个 if 语句
【发布时间】:2023-03-08 11:18:01
【问题描述】:

我在 Java 中有一个 if-else 结构如下:

                    if (A || B || C){
                        if (A){
                            //Do something
                        }
                        if (B){
                            //Do something
                        }
                        if (C){
                            //Do something
                        }
                    } else {
                        //Do something
                    }

我想知道是否有任何更清洁和更简单的方法来替换它?

【问题讨论】:

  • 你根本不需要第一个 if 语句。
  • @SebastianK 你会怎么做最后一个else 呢? if (! (A || B || C)) ?
  • 带默认和开关...见下文
  • 您能否在此处提供有关用例的更多信息?如何评估 ABC?是否期望它们是互斥的(即最多设置一个)?有多种方法可以完全完成您在下面的操作,但根据变量的来源,可能会有更易读的方法(从Map 查找、回调数组等) .
  • @Alex Wang 了解 1) 如果 ABC 是排他性的(只有一个可以是真的)和 2) 如果“做某事”始终是同一段代码。

标签: java if-statement


【解决方案1】:

是的。

if (A) {
  // do A
}
if (B) {
  // do B
}
if (C) {
  // do C
}
if (! (A || B || C)) {
  // do "neither A or B or C"
}

【讨论】:

【解决方案2】:

虽然我认为你所拥有的一切都很好,但你可以这样做:

boolean d = false;
if (d |= A) { ... }
if (d |= B) { ... }
if (d |= C) { ... }
if (!d) {
  // What to do if A..C are all false.
}

如果任何条件匹配,这会将 d 设置为 true(d 表示“做了某事”)。

【讨论】:

  • @BartFriederichs 每个人都有。正如我所说:我认为现有的代码很好。
  • @AndyTurner 请注意,您必须初始化 boolean d = false;,否则将无法编译。
【解决方案3】:

如果 A、B 和 C 是评估成本高昂的条件,您可以使用附加标志来确保它们只被评估一次:

boolean found = false;
if (A) {
    //Do something
    found = true;
}
if (B){
    //Do something
    found = true;
}
if (C){
    //Do something
    found = true;
}
if (!found) {
    //Do something
}

否则(即,如果它们的评估成本不高),我会保留您当前的条件。

【讨论】:

  • 谢谢,我认为这可以降低时间复杂度,因为在我的情况下,A、B、C 是一些复杂的条件
  • 根据个人喜好,我会将found = true; 放在条件句的首位,以便于看到您正在设置标志。
【解决方案4】:

我认为你应该使用 else if 条件:

if(A){

}else if(B){

}else if(C){

}else if(D){

}

但是,如果你有很多条件,比如 A、B、C 等,你会觉得你的程序逻辑有问题

【讨论】:

  • 不,你不能使用它,因为可能有A = true, B = true, C = false,你的代码也会执行第一个case。这与原始帖子中的不同。
【解决方案5】:

还有一种可能的解决方案:

public class ABC {

    private static final Logger log = LoggerFactory.getLogger(ABC.class);

    @Test
    public void abc() {
        boolean A = true;
        boolean B = false;
        boolean C = true;

        boolean abcProcessed = false;

        abcProcessed |= process(A, () -> {
            // Do something for A
            log.debug("A");
        });
        abcProcessed |= process(B, () -> {
            // Do something for B
            log.debug("B");
        });
        abcProcessed |= process(C, () -> {
            // Do something for B
            log.debug("C");
        });

        if (!abcProcessed) {
            // Do something for !(A||B||C)
            log.debug("!(A||B||C)");
        }
    }

    private boolean process(boolean flag, DoSomethingInterface doSomethingInterface) {
        // check condition
        if (flag) {
            // execute code specific for condition
            doSomethingInterface.doSomething();
            // return true (processed)
            return true;
        }

        // return false (not processed)
        return false;
    }

    public interface DoSomethingInterface {

        // code specific for condition
        void doSomething();
    }
}

一个想法是将条件检查和相关代码移动到单独的方法中。

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2021-12-12
    • 2022-01-12
    相关资源
    最近更新 更多