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

相关推荐
henujolly6 小时前
go学习day two
后端
AI袋鼠帝6 小时前
腾讯这只小程序Agent🦀,帮我找到了最强日程、文件、知识管理姿势
后端
努力的小郑7 小时前
突发!Claude Code 51万行源码全网裸奔:一场史诗级“开源”事故,国内大厂笑麻了
前端·后端·ai编程
HashTang7 小时前
Claude Code 源码中 REPL.tsx 深度解析:一个 5005 行 React 组件的架构启示
前端·后端·ai编程
thatway19897 小时前
ARM TFM-1介绍及代码下载运行适配
后端
千寻girling8 小时前
不知道 Java 全栈 + AI 编程有没有搞头 ?
前端·人工智能·后端
小码哥_常8 小时前
Spring Boot 实现网络限速:让流量“收放自如”
后端
johnrui9 小时前
SpringBoot-JdbcTemplate
java·spring boot·后端
Victor35610 小时前
MongoDB(72)如何创建用户和角色?
后端
Victor35610 小时前
MongoDB(71)如何启用MongoDB身份验证?
后端