Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - Switch 表达式



使用**switch 表达式**,我们可以返回值,并且可以在像其他表达式一样的语句中使用它们。我们可以使用**case L -> label** 返回值,或者使用 yield,我们可以从 switch 表达式返回值。

Java 12 引入了**表达式到Switch 语句** 并将其作为预览功能发布。Java 13 添加了一个新的 yield 构造来从 switch 语句返回值。在 Java 14 中,**switch 表达式**现在是一个标准特性。

  • 每个 case 块都可以使用 yield 语句返回值。

  • 在枚举的情况下,可以跳过 default case。在其他情况下,需要 default case。

使用“case L ->”标签的 Switch 表达式

Java 提供了一种使用 case L - > 符号从 switch 表达式返回值的新方法。

语法

case label1, label2, ..., labeln -> expression;|throw-statement;|block 

其中 label1 到 labeln 代表要比较的各种值,我们可以使用 expression,一个语句来返回值或抛出表达式。

一旦 Java 运行时将左侧块中的任何标签与箭头匹配,它就会移动到箭头的右侧块并执行表达式(语句)并返回结果。

Switch 表达式示例:使用 case L -> 标签

在这个例子中,我们比较了 switch 表达式与 switch 语句。getDayType() 方法接受一个字符串输入,并通过评估 switch 表达式并返回值来返回相应的条目。而 getDayTypeOldStyle() 方法使用 switch 语句来比较每个 case,使用 break 语句来结束 switch case,并且要获取值,我们需要在变量中设置值。

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) {
      // evaluate switch expression and get a value 
      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;
	  // evaluate relevant cases and get a value into result variable 
      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;

Switch 表达式示例:使用“case L:”语句和 yield 语句

其中 label1 到 labeln 代表要比较的各种值,我们可以使用 expression 执行操作并使用 yield 语句返回值。

在这个例子中,我们比较了使用 yield 语句的 switch 表达式。getDayType() 方法使用带 yield 语句的 switch 表达式来获取结果,而 getDayTypeStyle1() 方法使用带冒号 (:) 符号的 switch case 和 yield 语句来获取所需的结果。

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(getDayTypeStyle2(""));

      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) {
         // we can use block statements to return a value using yield after 
         // executing other statements		 
         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 Ways
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)
广告