什么是 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 与原始类型 switchbyteshortchar 一起使用,它们各自的包装类型(int、{{ 1}}、ByteShort)、枚举类型和 Character type1Integer 语句用于测试基于值或条件范围的表达式,而 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 中找到正式规范。