Java12引入了对switch语句的增强,允许在switch语句中使用表达式来代替传统的语句列表。这样可以使得代码更加简洁和易读。

switch表达式也是作为预览语言功能的第一个语言改动被引入新版Java中来的,这是一种引入新特性的测试版的方法。通过这种方式,能够根据用户反馈进行升级、更改,如果没有被很好的接纳,则可以完全删除该功能。预览功能的没有被包含在JavaSE规范中。也就是说:这不是一个正式的语法,是暂时进行测试的一种语法。

传统的switch声明语句(switch statement)在使用中有一些问题:

  • 匹配自上而下,若无break,后面的case语句都会执行
  • 不同的case语句定义的变量名不能重复
  • 不能在一个case里写多个执行结果一致的条件
  • 整个switch不能作为表达式返回值

switch详细语法

扩展的switch语句,不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch语法,或者使用简化的case L ->模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch中的模式匹配(JEP305)做好准备。

使用Java12中switch表达式的写法,省去了break语句,避免了因少写break而出错。

同时将多个case合并到一行,显得简洁、清晰也更加优雅的表达逻辑分支,其具体写法就是将之前的case语句表成了case L ->,即如果条件匹配case,则执行标签右侧的代码,同时标签右侧的代码段只能是表达式、代码块或throw语句。

为了保持兼容性,case条件语句中依然可以使用字符,这时fall-through规则依然有效的,即不能省略原有的break语句,但是同一个switch结构里不能混用->:,否则会有编译错误。并且简化后的switch代码块中定义的局部变量,其作用域就限制在代码块中,而不是蔓延到整个switch结构,也不用根据不同的判断条件来给变量赋值。

JAVA12之前switch语句

package com.morris.java12;

/**
 * java12之前switch的使用
 */
public class SwitchBefore12Demo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season;
        switch (month) {
            case DECEMBER:
            case JANUARY:
            case FEBRUARY:
                season = "winter";
                break;
            case MARCH:
            case APRIL:
            case MAY:
                season = "spring";
                break;
            case JUNE:
            case JULY:
            case AUGUST:
                season = "summer";
                break;
            case SEPTEMBER:
            case OCTOBER:
            case NOVEMBER:
                season = "autumn";
                break;
            default:
                throw new RuntimeException("NoSuchMonthException");
        }
        System.out.println(season); // spring
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

JAVA12中switch语句

package com.morris.java12;

/**
 * java12中switch的使用
 */
public class Switch12Demo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season;
        switch (month) {
            case DECEMBER, JANUARY, FEBRUARY -> season = "winter";
            case MARCH, APRIL, MAY -> season = "spring";
            case JUNE, JULY, AUGUST -> season = "summer";
            case SEPTEMBER, OCTOBER, NOVEMBER -> season = "autumn";
            default -> throw new RuntimeException("NoSuchMonthException");
        }
        System.out.println(season); // spring
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

switch作为表达式返回值

下面是一个简单的示例:

package com.morris.java12;

/**
 * java12中switch的使用,作为表达式的返回值
 */
public class Switch12Demo2 {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season = switch (month) {
            case DECEMBER, JANUARY, FEBRUARY -> "winter";
            case MARCH, APRIL, MAY -> "spring";
            case JUNE, JULY, AUGUST -> "summer";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "autumn";
            default -> throw new RuntimeException("NoSuchMonthException");
        };
        System.out.println(season); // spring
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

在这个示例中,switch语句的返回值是根据不同的case条件计算得出的。这种语法形式可以减少冗余的代码,提高代码的可读性。