Java 12的switch详解

2020-06-24 17:00:19 浏览数 (1)

Java的switch语句是一个变化较大的语法(可能是因为Java的switch语句一直不够强大、熟悉swift的可与swift的switch语句对比一下,就会发现Java的switch弱爆了),因为Java的很多版本都在不断地改进switch语句:

  • 从Java 5 开始,Java的switch语句可使用枚举了。
  • 从Java 7 开始,Java的switch语句支持使用String类型的变量和表达式了。
  • 从Java 11 开始,Java的switch语句会自动对省略break导致的贯穿提示警告(以前需要使用-X:fallthrough选项才能显示出来)

但从Java 12开始,Java的switch语句可能要开挂了。

Java 12以前

先看Java 12以前的switch程序,代码如下。

代码语言:javascript复制
public class SwitchTest1
{
    public static void main(String[] args)
    {
        // 声明变量score,并为其赋值为'C'
        var score = 'C';
        // 执行switch分支语句
        switch (score)
        {
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
                System.out.println("良好");
                break;
            case 'C':
                System.out.println("中");
                break;
            case 'D':
                System.out.println("及格");
                break;
            case 'E':
                System.out.println("不及格");
                break;
            default:
                System.out.println("成绩输入错误");
        }
    }
}

这是典型的Java 11以前的switch写法,程序较为臃肿,而且你不能忘记写break,否则switch就会贯穿、导致程序出现错误(当然,Java 11会提示警告)。

Java 12不需要break了

如果你对switch忘记写break导致贯穿实在烦腻了,可以试试Java 12对switch的改进。

你只要将case后面的冒号(:)改成箭头,那么你即使不写break也不会贯穿了,因此上面程序可改写如下形式。

代码语言:javascript复制
public class SwitchTest2
{
    public static void main(String[] args)
    {
        // 声明变量score,并为其赋值为'C'
        var score = 'C';
        // 执行switch分支语句
        switch (score)
        {
            case 'A' -> System.out.println("优秀");
            case 'B' -> System.out.println("良好");
            case 'C' -> System.out.println("中");
            case 'D' -> System.out.println("及格");
            case 'E' -> System.out.println("不及格");
            default -> System.out.println("成绩输入错误");
        }
    }
}

上面代码是不是简洁多了?

Java 12的switch表达式

Java 12的switch甚至可作为表达式了——不再是单独的语句(这是要追赶Swift的节奏呀)。例如如下程序。

代码语言:javascript复制
public class SwitchTest3
{
    public static void main(String[] args)
    {
        // 声明变量score,并为其赋值为'C'
        var score = 'C';
        // 执行switch分支语句
        String s = switch (score)
        {
            case 'A' -> "优秀";
            case 'B' -> "良好";
            case 'C' -> "中";
            case 'D' -> "及格";
            case 'F' -> "不及格";
            default -> "成绩输入错误";
        };
    System.out.println(s);
    }
}

上面程序直接将switch表达式的值赋值给s变量,这样switch不再是一个语句,而是一个表达式,这种写法为Java的switch增加了无限想像空间。

Java 12中switch的多值匹配

当你把switch中的case后的冒号改为箭头之后,此时switch就不会贯穿了,但在某些情况下,程序本来就希望贯穿——比如我就希望两个case共用一个执行体!那Java 12的switch怎么办?

当然有办法,Java 12的switch中的case支持多值匹配,这样程序就变得更加简洁了。例如如下程序。

代码语言:javascript复制
public class SwitchTest4
{
    public static void main(String[] args)
    {
        // 声明变量score,并为其赋值为'C'
        var score = 'B';
        // 执行switch分支语句
        String s = switch (score)
        {
            case 'A', 'B' -> "上等";
            case 'C' -> "中等";
            case 'D', 'E' -> "下等";
            default -> "成绩输入错误";
        };
    System.out.println(s);
    }
}

看到上面的代码,是不是感觉很爽,是不是感觉Java正在不断焕发新机?即使老如Java,依然可以魅力如初!

接下来的Java的switch是不是还可以支持区间匹配呢?让我们拭目以待。

本文结束

0 人点赞