Java switch语句

时间:2020-01-09 10:36:55  来源:igfitidea点击:

Java switch语句使我们可以根据某些变量的值选择一组要执行的语句。实际上,这有点类似于Java if语句,尽管Java switch语句提供了更多压缩的语法,并且行为和可能性有所不同。在本Java切换教程中,我将解释原始Java切换指令的工作方式,以及对切换指令的修改,使其具有打开Java枚举,Java字符串的函数,并最终解释了Java中添加的新的切换表达式语法。 并在Java 13中进行了改进。

Java Switch语句示例

让我们从一个Javaswitch语句代码示例开始:

int amount = 9;

switch(amount) {
    case     0 : System.out.println("amount is  0"); break;
    case     5 : System.out.println("amount is  5"); break;
    case    10 : System.out.println("amount is 10"); break;
    default    : System.out.println("amount is something else");
}

该开关示例首先创建一个名为" amount"的变量,并为其分配值" 9"。

其次,示例"切换""金额"变量的值。在switch语句内部有3个case语句和一个default语句。

每个case语句都会将amount变量的值与一个常量值进行比较。如果'amount'变量值等于该常数,则执行冒号(:)之后的代码。注意每个语句后的break关键字。如果此处没有使用break关键字,则执行可以继续执行其余case语句,直到遇到break为止,或者到达switch语句的末尾。关键字break使执行跳出switch语句。

如果没有case语句不匹配amount变量的值,则执行default语句。如果前面的case语句最后没有break命令,也可以执行default语句。我们不需要default语句。它是可选的。

等价的if语句

开头显示的Java开关示例等效于以下Java if语句集:

int amount = 9;

if     (amount == 0) { System.out.println("amount is 0"); }
else if(amount == 5) { System.out.println("amount is 5"); }
else if(amount == 10){ System.out.println("amount is 10"); }
else                 { System.out.println("amount is something else"; }

尽管看起来几乎一样,但在某些情况下使用Java switch语句更容易,更快捷。另外,Java 12中添加的新Java switch表达式(请参阅本教程的后面部分)使得使用switch语句可以进行某些构造,而if语句则无法实现。

带参数的switch

在本Java开关教程开始的示例中,我们声明了一个" int"变量,并立即将其值设置为9. 在现实的Java应用程序中,我们很可能不会这样做。相反,我们将打开方法的输入参数的值,或者通过网络等从文件中读取的值。这是打开方法参数的示例:

private static void switchOnIntegers(int size) {
  switch(size) {

    case 0  : { System.out.println("size is small");   break; }
    case 1  : { System.out.println("size is medium");  break; }
    case 2  : { System.out.println("size is large");   break; }
    case 3  : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}

在byte,short,char,int,String或者enum类型上使用switch

如我们所见,switch语句打开一个变量。在Java 7之前,此变量必须是数字变量,并且必须是"字节","短","字符"或者"整数"。在Java 7中,变量也可以是"字符串",也可以打开Java枚举变量。在以下各节中,我将向我们展示如何打开各种不同的Java类型的示例。

switch使用byte,short和int参数

我们可以打开Java的byte,short或者int,如以下示例所示:

private static void switchOnIntegers(byte size) {
  switch(size) {

    case 0  : { System.out.println("size is small");   break; }
    case 1  : { System.out.println("size is medium");  break; }
    case 2  : { System.out.println("size is large");   break; }
    case 3  : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}
private static void switchOnIntegers(short size) {
  switch(size) {

    case 0  : { System.out.println("size is small");   break; }
    case 1  : { System.out.println("size is medium");  break; }
    case 2  : { System.out.println("size is large");   break; }
    case 3  : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}
private static void switchOnIntegers(int size) {
  switch(size) {

    case 0  : { System.out.println("size is small");   break; }
    case 1  : { System.out.println("size is medium");  break; }
    case 2  : { System.out.println("size is large");   break; }
    case 3  : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}

注意,以上示例之间唯一的不同是方法参数size的数据类型。其他一切都一样。

switch使用字符参数

也可以打开Javachar值。这是一个打开char参数的例子:

private static void switchOnChars(char size) {
  switch(size) {

    case 'S'  : { System.out.println("size is small");   break; }
    case 'M'  : { System.out.println("size is medium");  break; }
    case 'L'  : { System.out.println("size is large");   break; }
    case 'X'  : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}

switch使用字符串参数

从Java 7开始,也可以在Java String上使用switch。这是在String上的Java开关的示例:

private static void switchOnStrings(String size) {
  switch(size) {

    case "S"  : { System.out.println("size is small");   break; }
    case "M"  : { System.out.println("size is medium");  break; }
    case "L"  : { System.out.println("size is large");   break; }
    case "XL" : { System.out.println("size is X-large"); break; }

    default : { System.out.println("size is not S,M,L or XL: " + size); }
  }
}

switch使用Java枚举作为参数

也可以打开Java枚举。这是一个Java示例,该示例创建一个Java枚举,然后在switch语句中使用它:

public class SwitchOnEnum{
  private static enum Size {
    SMALL, MEDIUM, LARGE, X_LARGE
  }

  private static void switchOnEnum(Size size) {
    switch(size) {

      case SMALL   : { System.out.println("size is small");   break; }
      case MEDIUM  : { System.out.println("size is medium");  break; }
      case LARGE   : { System.out.println("size is large");   break; }
      case X_LARGE : { System.out.println("size is X-large"); break; }

      default : {
        default : { System.out.println("size is not S,M,L or XL: " + size); }
      }
    }
  }
}

多个case语句可用于同一操作

如果要对多个case语句执行相同的操作,则可以这样编写:

char key = '\t'

switch(key) {
    case ' '  :
    case '\t' : System.out.println("white space char");
                break;

    default   : System.out.println("char is something else");
}

请注意,冒号后的第一个case语句没有任何操作。这样的结果是,执行只会"陷入"下一个case语句(和下一个等)的操作,直到遇到" break"为止。下一个break语句位于第二个case语句之后。这意味着,对于第一和第二个case语句,将执行与第二个case语句相同的操作。

每个case具有多个值

从Java 13及更高版本开始,每个case语句还可以具有多个值,而不是多个case语句贯穿到下一个。这是上一节中的示例,它被重写为在单个state语句中使用多个值:

char key = '\t'

switch(key) {
    case     ' ', '\t' :
             System.out.println("white space char");
             break;

    default: System.out.println("char is something else");
}

请注意,第一个case语句的多个值如何用逗号分隔。

Java switch表达式

Java 12添加了switch表达式作为实验函数。 Java switch表达式switch语句可以返回一个值。因此,可以像其他Java表达式(也将其求值)一样,将其作为表达式求值。在本节中,我将向我们展示Java 12的Java开关表达式如何工作。

记住,我在这里有本教程的Javaswitch表达式部分的视频版本:

这首先是一个Java开关表达式示例:

int  digitInDecimal = 12;
char digitInHex     =
    switch(digitInDecimal){
        case  0 -> '0';
        case  1 -> '1';
        case  2 -> '2';
        case  3 -> '3';
        case  4 -> '4';
        case  5 -> '5';
        case  6 -> '6';
        case  7 -> '7';
        case  8 -> '8';
        case  9 -> '9';
        case 10 -> 'A';
        case 11 -> 'B';
        case 12 -> 'C';
        case 13 -> 'D';
        case 14 -> 'E';
        case 15 -> 'F';

        default -> '?';
    };

System.out.println(digitInHex);

这个Javaswitch表达式示例将0到15之间的值转换为十六进制数字字符。

注意每个case语句后的冒号()是如何被->运算符替换的。在开关表达式中使用该运算符可向Java编译器发出信号,该case语句选择开关表达式的返回值,而不是选择要执行的代码块。

还要注意,case语句后面没有break关键字。由于用->运算符选择的值被解释为switch表达式的返回值,因此每个语句后的break都是隐式的(实际上是不必要的)。我们也可以将->视为" return"语句,该语句从switch表达式返回值,从而中断了switch表达式的执行。

最后,请注意如何为digitInHex变量分配switch表达式的返回值。这是捕获Java开关表达式的输出的方式。我们还可以将其值作为方法的返回值返回,如下所示:

public char toHexDigit(int digitInDecimal) {

    return
    switch(digitInDecimal){
        case  0 -> '0';
        case  1 -> '1';
        case  2 -> '2';
        case  3 -> '3';
        case  4 -> '4';
        case  5 -> '5';
        case  6 -> '6';
        case  7 -> '7';
        case  8 -> '8';
        case  9 -> '9';
        case 10 -> 'A';
        case 11 -> 'B';
        case 12 -> 'C';
        case 13 -> 'D';
        case 14 -> 'E';
        case 15 -> 'F';

        default -> '?';
    };

}

Java开关表达式还可以与Java字符串值一起使用。这是一个使用字符串打开的Java开关表达式示例:

String token = "123";

int tokenType = switch(token) {
    case "123" -> 0;
    case "abc" -> 1;
    default -> -1;
};

本示例根据String令牌的值解析令牌类型(整数值)。

Java switch变量说明

在Java 13中,我们可以使用Java开关yield指令从Java开关表达式返回值,而无需使用箭头运算符(->)。这是Java切换yield指令外观的示例:

String token = "123";

int tokenType = switch(token) {
    case "123" : yield 0;
    case "abc" : yield 1;
    default : yield -1;
};

switch表达用例

在需要基于另一个值获取一个值的用例中,Java开关表达式很有用。例如,如上例所示,在数字值和字符之间进行转换时。

将字符解析为值或者将字符串标记解析为整数标记类型时,Java开关表达式也很有用。通常,每当我们需要将一个值解析为另一个值时。