在Java中简化if语句的方法

时间:2017-04-05 20:47:30

标签: java if-statement java-8

我目前有这样的if语句:

if (condition1 || condition2) {
     //Do stuff here
     //Small things happened here
     //More stuff

     if (condition1) {
          System.out.println("Thank");
          // Do Task Alpha
          // Do Task Beta
     } else {
          System.out.println("You");
          // Do Task Delta
          // Do Task Gamma
     }
}

所以基本的想法是当任一条件为真时发生if语句(在我的情况下,两个条件不能同时为真)。

然而,一旦进入if语句,有一点如果第一个条件为真,则打印“Thank”并执行Task Alpha和Beta。如果第二个条件为真,则打印“你”并执行任务Delta和Gamma。在我们达到这个分歧点之前,会执行许多常见的陈述。

这是编写整个if语句的最佳/最简单方法吗?

感谢。

4 个答案:

答案 0 :(得分:8)

如果

,您可以使用内部三元组
String toPrint = test == null ? "Thank" : "You";
System.out.println(toPrint);

甚至

System.out.println(test == null ? "Thank" : "You");

答案 1 :(得分:3)

编写此操作的最佳方式与您的问题完全一样。如果condition1是一个复杂的,可能很昂贵的表达式,请将其结果存储到本地boolean变量中:

final boolean condition1Result = condition1;
if (condition1Result || condition2) {
     //Do stuff here
     //Small things happened here
     //More stuff

     if (condition1Result) {
          System.out.println("Thank");
          // Do Task Alpha
          // Do Task Beta
     } else {
          System.out.println("You");
          // Do Task Delta
          // Do Task Gamma
     }
}

考虑内联通用代码可能很诱人,即

if(condition1) {
     //Do stuff here
     //Small things happened here
     //More stuff
     System.out.println("Thank");
     // Do Task Alpha
     // Do Task Beta
} else if(condition2) {
     //Do stuff here
     //Small things happened here
     //More stuff
     System.out.println("You");
     // Do Task Delta
     // Do Task Gamma
}

但除非公共代码真的很小,否则我不会这样做。如果有益,JVM应该能够在运行时进行这样的优化,因此您应该更喜欢避免代码重复的变体。

如果整体代码过于复杂,请考虑将块重构为方法。

答案 2 :(得分:0)

如果if-else块发生在包装if块的末尾 - 您可以在 if块后移动它们

 if (test == null || testStr.equals("testStr")) {
 //Do stuff here
 //Small things happened here
 //More stuff
 }

 if (test == null) {
      System.out.println("Thank");
 } else if (testStr.equals("testStr")) {
      System.out.println("You");
 }

这样你只有一层嵌套。

答案 3 :(得分:0)

链接很多块会使代码更难维护。 避免这些链接块的一种方法是在到达满足条件之后不必执行的代码行之前更频繁地使用返回来退出方法。检查以下示例的重构版本:

private void someMethod(){
    /*If none of the conditions is met, exits without 
    executing any code.*/
    if (!(condition1 || condition2)) {
        return;
    }

    /*Executes code common to any of the two conditions.*/
    //Do stuff here
    //Small things happened here
    //More stuff

    if (condition1) {
        System.out.println("Thank");
        // Do Task Alpha
        // Do Task Beta
        /*After executing the code for the 1st condition,
        exit to avoid the code for the 2nd one to be executed.*/
        return;  
    } 

    /*If the execution reached up to here, then the 2nd
    condition was met and its corresponding code is executed.*/        
    System.out.println("You");
    // Do Task Delta
    // Do Task Gamma
}