使用 Switch 表达式返回值
使用 Switch 表达式,我们可以返回一个值,并且可以在语句中像其他表达式一样使用它们。我们可以使用 case L ->
标签来返回一个值或者使用 yield
来从 Switch 表达式返回一个值。
Java 12 引入了 Switch 表达式,并将其作为预览特性发布。Java 13 添加了一个新的 yield
构造来从 Switch 语句返回一个值。到了 Java 14,Switch 表达式已经成为标准特性。
每个 Case 块都可以使用 yield
语句返回一个值。
对于枚举,可以省略 default
案例。而在其他情况下,则需要 default
案例。
使用 case L ->
标签的 Switch 表达式
Java 提供了一种新的方式来从 Switch 表达式返回一个值,即使用 case L ->
标记。
语法
case label1, label2, ..., labeln -> expression;|throw-statement;|block
其中 label1
到 labeln
表示要比较的各种值,并且我们可以使用表达式或返回一个值的语句。
一旦 Java 运行时匹配到箭头左侧的任何标签,它就会移动到箭头右侧的块,并执行表达式(语句),然后返回结果。
示例:使用 case L ->
标签的 Switch 表达式
在这个例子中,我们比较了 Switch 表达式与 Switch 语句。getDayType()
方法接受一个字符串输入,并通过评估 Switch 表达式来返回相应的条目;而 getDayTypeOldStyle()
方法则使用 Switch 语句来比较每个情况,并使用 break
语句结束 Switch 情况,为了获取一个值,我们必须在变量中设置这个值。
package com.tutorialspoint;
public class SwitchTester {
public static void main(String[] args) {
System.out.println("Old Switch");
System.out.println(getDayTypeOldStyle("Monday"));
System.out.println(getDayTypeOldStyle("Saturday"));
System.out.println(getDayTypeOldStyle(""));
System.out.println("New Switch");
System.out.println(getDayType("Monday"));
System.out.println(getDayType("Saturday"));
System.out.println(getDayType(""));
}
public static String getDayType(String day) {
return switch (day) {
case "Monday", "Tuesday", "Wednesday","Thursday", "Friday" -> "Weekday";
case "Saturday", "Sunday" -> "Weekend";
default -> "Invalid day.";
};
}
public static String getDayTypeOldStyle(String day) {
String result = null;
switch (day) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
result = "Weekday";
break;
case "Saturday":
case "Sunday":
result = "Weekend";
break;
default:
result = "Invalid day.";
}
return result;
}
}
输出
编译并运行以上程序,将产生以下结果:
Old Switch
Weekday
Weekend
Invalid day.
New Switch
Weekday
Weekend
Invalid day.
使用 case L:
语句和 yield
语句的 Switch 表达式
在 Java 中,我们可以使用 yield
语句从 Switch 表达式和 Switch 语句中获取一个值。yield
语句返回一个值并结束 Switch 执行。
语法
case label1, label2, ..., labeln -> expression; yield value;
case label1:
case labeln: expression;
yield value;
其中 label1
到 labeln
表示要比较的各种值,并且我们可以使用表达式来执行一个操作并通过 yield
语句返回值。
示例:使用 case L:
语句和 yield
语句的 Switch 表达式
在这个例子中,我们比较了使用 yield
语句的 Switch 表达式。getDayType()
方法使用带有 yield
语句的 Switch 表达式来获取结果,而 getDayTypeStyle2()
方法则是使用带有冒号(:
)标记和 yield
语句的 Switch 情况来获得期望的结果。
package com.tutorialspoint;
public class SwitchTester {
public static void main(String[] args) {
System.out.println("Old Way");
System.out.println(getDayTypeStyle2("Monday"));
System.out.println(getDayTypeStyle2("Saturday"));
System.out.println("New Way");
System.out.println(getDayType("Monday"));
System.out.println(getDayType("Saturday"));
System.out.println(getDayType(""));
}
public static String getDayType(String day) {
return switch (day) {
case "Monday", "Tuesday", "Wednesday","Thursday", "Friday" -> {
System.out.println("In Weekdays");
yield "Weekday";
}
case "Saturday", "Sunday" -> {
System.out.println("In Weekends");
yield "Weekend";
}
default -> throw new IllegalStateException("Invalid day: " + day);
};
}
public static String getDayTypeStyle2(String day) {
return switch (day) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
yield "Weekday";
case "Saturday":
case "Sunday":
yield "Weekend";
default:
throw new IllegalStateException("Invalid day: " + day);
};
}
}
输出
编译并运行以上程序,将产生以下结果:
Old Way
Weekday
Weekend
New Way
In Weekdays
Weekday
In Weekends
Weekend
Exception in thread "main" java.lang.IllegalStateException: Invalid day:
at com.tutorialspoint.SwitchTester.getDayType(SwitchTester.java:26)
at com.tutorialspoint.SwitchTester.main(SwitchTester.java:13)