Java switch语句
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开关表达式也很有用。通常,每当我们需要将一个值解析为另一个值时。