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 新特性》

相关推荐
LucianaiB28 分钟前
耗时30天,DocPilot Qwen正式开源:一个免费无广的开源文档 AI 助手
前端·后端
神奇小汤圆1 小时前
聊聊Java中的of
后端
用户4618249598191 小时前
网关开发从入门到落地(05)Modbus 最简 C 代码实现:组包 + CRC + 解析(直接移植可用)
后端
foggyprojects1 小时前
SQL 模板写到这里,为什么 Mongo 也可以用同一种方式接进来
后端
卷无止境1 小时前
零信任架构与传统边界安全:一场关于"信任"的根本分歧
后端
风止何安啊1 小时前
我一个前端仔,居然用 Python 搞起了 AI?从零到一,撸了个 AI 聊天框小 demo
前端·人工智能·后端
逍遥运德1 小时前
PostgreSQL ---【序列】用法详解
后端·sql·postgresql
回家路上绕了弯2 小时前
AgentScope Harness 深度实战:让Java智能体从“Demo可用”走向“生产可用”
后端
卷心菜投手ovo2 小时前
RAG 为什么引用总是对不上?
后端·github
foggyprojects2 小时前
动态 SQL 模板里,权限条件为什么要注入而不是散落在业务代码里
后端