switch表达式:怎么简化多情景操作

代码示例:

js 复制代码
package co.ivi.jus.swexpr.modern;

import java.util.Calendar;

class DaysInMonth {
    public static void main(String[] args) {
        Calendar today = Calendar.getInstance();
        int month = today.get(Calendar.MONTH);
        int year = today.get(Calendar.YEAR);

        int daysInMonth = switch (month) {
            case Calendar.JANUARY,
                 Calendar.MARCH,
                 Calendar.MAY,
                 Calendar.JULY,
                 Calendar.AUGUST,
                 Calendar.OCTOBER,
                 Calendar.DECEMBER -> 31;
            case Calendar.APRIL,
                 Calendar.JUNE,
                 Calendar.SEPTEMBER,
                 Calendar.NOVEMBER -> 30;
            case Calendar.FEBRUARY -> {
                if (((year % 4 == 0) && !(year % 100 == 0))
                        || (year % 400 == 0)) {
                    yield 29;
                } else {
                    yield 28;
                }
            }
            default -> throw new RuntimeException(
                    "Calendar in JDK does not work");
        };

        System.out.println(
                "There are " + daysInMonth + " days in this month.");
    }
}

switch 代码块出现在了赋值运算符的右侧。这也就意味着,这个 switch 代码块表示的是一个数值,或者是一个变量。换句话说,这个 switch 代码块是一个表达式。

一个 case 语句,可以处理多个情景。这些情景,使用逗号分隔开来,共享一个代码块。而传统的 switch 代码,一个 case 语句只能处理一种情景。

"->",它是一个箭头标识符。这个符号使用在 case 语句里,一般化的形式是"case L ->"。这里的 L,就是要匹配的一个或者多个情景。如果目标变量和情景匹配,那么就执行操作符右边的表达式或者代码块。如果要匹配的情景有两个或者两个以上,就要使用逗号","用分隔符把它们分割开来。

箭头标识符右侧可以是表达式、代码块或者异常抛出语句,而不能是其他的形式。如果只需要一个语句,这个语句也要以代码块的形式呈现出来。

箭头标识符右侧需要一个表达 switch 表达式的数值,这是一个很强的约束。如果一个语句破坏了这个需要,它就不能出现在 switch 表达式里。

大多数情况下,switch 表达式箭头标识符的右侧是一个数值或者是一个表达式。 如果需要一个或者多个语句,我们就要使用代码块的形式。这时候,我们就需要引入一个新的 yield 语句来产生一个值,这个值就成为这个封闭代码块代表的数值。yield 只能用在 switch 表达式里,而不能用在 switch 语句里。

在 switch 表达式里,所有的情景都要列举出来,不能多、也不能少(这也就是我们常说的穷举)。


此文章为9月Day8学习笔记,内容来源于极客时间《深入剖析 Java 新特性》

相关推荐
咖啡啡不加糖4 分钟前
Arthas 使用指南:Java 应用诊断利器
java·spring boot·后端
J_liaty4 分钟前
SpringBoot整合Canal实现数据库实时同步
数据库·spring boot·后端·canal
lead520lyq5 分钟前
Golang Grpc接口调用实现账号密码认证
开发语言·后端·golang
JaguarJack8 分钟前
Laravel AI SDK 在 Laracon India 2026 首次亮相
后端·php·laravel
bjxiaxueliang2 小时前
一文掌握SpringBoot:HTTP服务开发从入门到部署
spring boot·后端·http
野犬寒鸦15 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈15 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
李梨同学丶17 小时前
0201好虫子周刊
后端
思想在飞肢体在追17 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Loo国昌20 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding