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

Ank*_*ush 259 java switch-statement

在我的代码中,程序根据用户输入的文本执行某些操作.我的代码看起来像:

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }
Run Code Online (Sandbox Code Playgroud)

然而,案件里面的代码text1text4是一样的.因此,我想知道是否有可能实现类似的东西

case text1||text4: {
            //blah
            break;
        }
Run Code Online (Sandbox Code Playgroud)

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

PSR*_*PSR 498

您可以使用CASE以下两种语句.

  case text1: 
  case text4:{
            //blah
            break;
        }
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是代码的输出:

Number of Days = 29
Run Code Online (Sandbox Code Playgroud)

通电路:

另一个兴趣点是break语句.每个break语句都会终止封闭的switch语句.控制流继续切换块后面的第一个语句.break语句是必要的,因为没有它们,switch块中的fall through语句:匹配的case标签之后的所有语句都按顺序执行,而不管后续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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是代码的输出:

August
September
October
November
December
Run Code Online (Sandbox Code Playgroud)

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

在Java SE 7及更高版本中,您可以在switch语句的表达式中使用String对象.以下代码示例显示基于名为month的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出为8.

来自Java Docs

  • 值得一提的是,这种语言功能称为fallthrough.没有"break"的情况基本上附加了下一个案例块,它在视觉上方,因此_fall_ through. (15认同)
  • @ Kobor42首先学习如何在公共网站上讲话.任何你的建议如何帮助.谢谢 (5认同)
  • JDK-12集成了JEP-325可以[现在改写](/sf/answers/3656675501/)来进行开关演示。:) (2认同)

Gri*_*han 37

你可以这样做:

case text1:
case text4: {
            //blah
            break;
}
Run Code Online (Sandbox Code Playgroud)

  • @Xiddoc 为了回答 OP,我使用 `text1` 作为 `"firstCase"` 和 `text4` 作为 `"secondCase"`,阅读问题 `case text1||text4: { //blah break; }`,您的编辑通过了,但我的原始答案对于 OP 来说很简单 (2认同)

Boh*_*ian 25

case值只是无码"转到"点可以共享同一个入口点:

case text1:
case text4: 
    //blah
    break;
Run Code Online (Sandbox Code Playgroud)

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

  • 当你的切入点理智时,这总是一件好事. (4认同)

kal*_*jak 20

做就是了

case text1: case text4: 
     do stuff;
     break;
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 10

通过在JDK-12早期访问版本中集成JEP 325:开关表达式(预览),现在可以使用新的开关标签形式:-

case text1, text4 -> {
     //blah
} 
Run Code Online (Sandbox Code Playgroud)

或从答案之一改写演示,例如:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是您可以尝试的方法- 使用Maven编译JDK12预览功能


Ank*_*rma 7

Fall through方法是我觉得最好的方法。

case text1:
case text4: {
        //Yada yada
        break;
} 
Run Code Online (Sandbox Code Playgroud)


sco*_*ski 6

括号是不必要的.做就是了

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;
Run Code Online (Sandbox Code Playgroud)

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


小智 6

您可以使用:

case text1: case text4: 
     do stuff;
     break;
Run Code Online (Sandbox Code Playgroud)


Col*_*n D 5

fallthrough其他人的答案很好.

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

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

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }
Run Code Online (Sandbox Code Playgroud)

我个人觉得这种写作案例语句的风格更易于维护,而且更具可读性,尤其是当您调用的方法具有良好的描述性名称时.


小智 5

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

case text1:
case text4: {
//做一些
打破;
}

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