对一个switch case语句使用两个值

时间:2013-05-23 06:10:54

标签: java switch-statement

在我的代码中,程序会根据用户输入的文本执行某些操作。我的代码如下:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

但是,案例text1text4中的代码是相同的。因此,我想知道是否可以实现像

这样的东西
case text1||text4: {
            //blah
            break;
        }

我知道||运算符在case语句中不起作用,但是我可以使用类似的东西。

13 个答案:

答案 0 :(得分:450)

您可以使用两个CASE语句,如下所示。

  case text1: 
  case text4:{
            //blah
            break;
        }

请参见此示例:代码示例计算特定月份的天数:

class SwitchDemo {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if (((year % 4 == 0) && 
                     !(year % 100 == 0))
                     || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = "
                           + numDays);
    }
}

这是代码的输出:

Number of Days = 29

下通

  

另一个兴趣点是break语句。每个休息声明   终止封闭的switch语句。控制流程继续   切换块后面的第一个语句。休息声明   是必要的,因为没有它们,switch块fall through中的语句:在匹配的case标签之后的所有语句都被执行   顺序,不管后续案例标签的表达,   直到遇到break语句。

示例代码:

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

这是代码的输出:

August
September
October
November
December

在交换机语句中使用字符串

  

在Java SE 7及更高版本中,您可以在交换机中使用String对象   陈述的表达。以下代码示例,   根据String的值显示月份的编号   命名月份:

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default: 
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

此代码的输出为8。

FROM Java Docs

答案 1 :(得分:36)

你可以这样做:

case text1:
case text4: {
            //blah
            break;
}

答案 2 :(得分:25)

case值只是无代码“goto”点,可以共享相同的入口点:

case text1:
case text4: 
    //blah
    break;

请注意,大括号是多余的。

答案 3 :(得分:19)

只做

case text1: case text4: 
     do stuff;
     break;

答案 4 :(得分:6)

括号是不必要的。只是做

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

如果有人好奇,这被称为案件突破。执行此操作的能力是结束案例陈述需要break;的原因。有关详细信息,请参阅维基百科文章http://en.wikipedia.org/wiki/Switch_statement

答案 5 :(得分:5)

其他人的fallthrough答案很好。

然而,另一种方法是从case语句的内容中提取方法,然后从每种情况调用适当的方法。

在下面的示例中,案例'text1'和案例'text4'的行为相同:

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

我个人认为这种写作案例陈述更具可维护性和可读性,特别是当您调用的方法具有良好的描述性名称时。

答案 6 :(得分:4)

通过接近是我感觉最好的方法。

case text1:
case text4: {
        //Yada yada
        break;
} 

答案 7 :(得分:4)

通过在JDK-12早期访问版本中集成JEP 325: Switch Expressions (Preview),现在可以使用新形式的switch标签:-

case text1, text4 -> {
     //blah
} 

或改写one of the answers中的演示,例如:-

public class RephraseDemo {

    public static void main(String[] args) {
        int month = 9;
        int year = 2018;
        int numDays = 0;

        switch (month) {
            case 1, 3, 5, 7, 8, 10, 12 ->{
                numDays = 31;
            }
            case 4, 6, 9, 11 ->{
                numDays = 30;
            }
            case 2 ->{
                if (((year % 4 == 0) &&
                        !(year % 100 == 0))
                        || (year % 400 == 0))
                    numDays = 29;
                else
                    numDays = 28;
            }
            default ->{
                System.out.println("Invalid month.");

            }
        }
        System.out.println("Number of Days = " + numDays);
    }
}

这里是您可以尝试的方法-Compile a JDK12 preview feature with Maven

答案 8 :(得分:3)

案例值只是无代码“goto”点,可以共享相同的入口点:

  

案例text1:
  案例text4:{
     //做点什么      打破;
  }

请注意,大括号是多余的。

答案 9 :(得分:3)

您可以使用:

case text1: case text4: 
     do stuff;
     break;

答案 10 :(得分:1)

JDK-13中的

JEP 354: Switch Expressions (Preview)和JDK-14中的JEP 361: Switch Expressions (Standard)将扩展 switch语句 ,因此可以将其用作 表达式

现在您可以:

  • 直接从开关表达式
  • 分配变量
  • 使用新形式的开关标签(case L ->):

    “ case L->”开关标签右侧的代码仅限于表达式,块或(为方便起见)throw语句。

  • 每种情况下均使用多个常量,以逗号分隔,
  • ,也没有更多的休息时间

    要从switch表达式中产生一个值,请删除带有值语句的break,而推荐使用yield语句。

因此one of the answers的演示可能如下所示:

public class SwitchExpression {

  public static void main(String[] args) {
      int month = 9;
      int year = 2018;
      int numDays = switch (month) {
        case 1, 3, 5, 7, 8, 10, 12 -> 31;
        case 4, 6, 9, 11 -> 30;
        case 2 -> {
          if (java.time.Year.of(year).isLeap()) {
            System.out.println("Wow! It's leap year!");
            yield 29;
          } else {
            yield 28;
          }
        }
        default -> {
          System.out.println("Invalid month.");
          yield 0;
        }
      };
      System.out.println("Number of Days = " + numDays);
  }
}

答案 11 :(得分:1)

另一种变体?

  switch (name) {
    case ['text1', 'text2']:
      // do something
      break
    case 'text3':
      // do something
      break
    default:
      // do something
      break
  }

答案 12 :(得分:0)

Java 12及更高版本

29167  data one;
29168    set sashelp.class;
29169  run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.ONE has 19 observations and 5 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds


29170
29171  %stop_submission

ERROR: Execution canceled by an %ABORT CANCEL statement.
NOTE: The SAS System stopped processing due to receiving a CANCEL request.

您还可以通过switch case表达式分配一个值:

switch (name) {
    case text1, text4 -> // do something ;
    case text2, text3, text 5 -> // do something else ;
    default -> // default case ;
}

“收益”关键字

它允许您通过开关大小写表达式返回一个值

String text = switch (name) {
    case text1, text4 -> "hello" ;
    case text2, text3, text5 -> "world" ;
    default -> "goodbye";
};
相关问题