如何解决什么是 switch 表达式,它们与 switch 语句有什么不同?
作为 Java SE 12 的一部分,引入了 switch
expressions,并且从 Java SE 14 开始,它们已经标准化。它们与 command = subprocess.Popen(source_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
command.communicate()
语句有何不同?
解决方法
switch
语句:
与 switch
语句不同,if/else if/else
语句可以有多个可能的执行路径。 switch
与原始类型 switch
、byte
、short
和 char
一起使用,它们各自的包装类型(int
、{{ 1}}、Byte
和 Short
)、枚举类型和 Character
type1。 Integer
语句用于测试基于值或条件范围的表达式,而 String
语句用于测试仅基于单个值的表达式。
演示
if-else
输出:
switch
enum PaymentStatus {
UNPAID,PARTPAID,PAID,DISPUTED,UNKNOWN;
}
public class Main {
public static void main(String[] args) {
String message = "";
PaymentStatus paymentStatus = PaymentStatus.PARTPAID;
switch (paymentStatus) {
case UNPAID:
message = "The order has not been paid yet. Please make the minimum/full amount to procced.";
break;
case PARTPAID:
message = "The order is partially paid. Some features will not be available. Please check the brochure for details.";
break;
case PAID:
message = "The order is fully paid. Please choose the desired items from the menu.";
break;
default:
throw new IllegalStateException("Invalid payment status: " + paymentStatus);
}
System.out.println(message);
}
}
表达式:
The order is partially paid. Some features will not be available. Please check the brochure for details.
表达式是在 Java SE 12 中引入的。但是,它在 Java SE 12 和 13 中仍然是预览功能,并最终在 Java SE 14 中标准化。{{3 }},switch
表达式计算为单个值,并且可以在语句中使用。它还引入了“箭头 switch
”标签,从而无需使用 switch
语句来防止落空。从 Java SE 15 开始,支持的数据类型没有变化(在上面的 case
语句部分中提到)。
演示
break
输出:
switch
带有 enum PaymentStatus {
UNPAID,UNKNOWN;
}
public class Main {
public static void main(String[] args) {
PaymentStatus paymentStatus = PaymentStatus.PARTPAID;
String message = switch (paymentStatus) {
case UNPAID -> "The order has not been paid yet. Please make the minimum/full amount to procced.";
case PARTPAID -> "The order is partially paid. Some features will not be available. Please check the brochure for details.";
case PAID -> "The order is fully paid. Please choose the desired items from the menu.";
default -> throw new IllegalStateException("Invalid payment status: " + paymentStatus);
};
System.out.println(message);
}
}
的 The order is partially paid. Some features will not be available. Please check the brochure for details.
表达式:
从 Java SE 13 开始,您可以使用 switch
语句代替箭头运算符 (->) 从 yield
表达式返回值。
演示
yield
输出:
switch
1 JDK 7 添加了对 enum PaymentStatus {
UNPAID,UNKNOWN;
}
public class Main {
public static void main(String[] args) {
PaymentStatus paymentStatus = PaymentStatus.PARTPAID;
String message = switch (paymentStatus) {
case UNPAID:
yield "The order has not been paid yet. Please make the minimum/full amount to procced.";
case PARTPAID:
yield "The order is partially paid. Some features will not be available. Please check the brochure for details.";
case PAID:
yield "The order is fully paid. Please choose the desired items from the menu.";
default:
throw new IllegalStateException("Invalid payment status: " + paymentStatus);
};
System.out.println(message);
}
}
的支持
写的不错!但我可能还会为单个 case 语句添加多个 case 的功能。下面的例子非常做作(有很多更好的方法来实现它)。它对字符串中的元音、数字、辅音和其他字符进行简单的频率计数。
int count[] = new int[4];
String s = "829s2bi9jskj*&@)(so2i2ksso";
for (char c : s.toCharArray()) {
int i = switch (c) {
case 'a','e','i','o','u' -> 0;
case '0','1','2','3','4','5','6','7','8','9' -> 1;
case 'b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z' -> 2;
default -> 3;
};
count[i]++;
}
System.out.printf("vowels - %d%n",count[0]);
System.out.printf("digits - %d%n",count[1]);
System.out.printf("consonants - %d%n",count[2]);
System.out.printf("other - %d%n",count[3]);
印刷品
vowels - 4
digits - 7
consonants - 10
other - 5
,
添加到现有答案:yield
也可以与 ->
一起使用,其主要目的是在单个表达式不足以满足给定情况时允许使用块:
var test = switch (value) {
case A -> 1;
case B -> 2;
case C -> {
System.err.println("neither A nor B"); // or some calculation
yield -1;
}
}
我还要提到 JEP-354,其中提出和描述了 switch 表达式。
可以像往常一样在 Java Language Specification 中找到正式规范。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。