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

相关推荐
Cosolar1 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
小蒜学长2 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
陈随易3 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
每天一道题3 小时前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
前端的日常3 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
IT_陈寒4 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
ServBay5 小时前
本地模型已经跑起来了,Copilot Fusion 为什么还要联网?
后端·ai编程·github copilot
武子康5 小时前
H3-World 的动作没按时发生,先检查时间线变成了什么
人工智能·后端·agent
苍何5 小时前
腾讯 Buddy One 来了,办公全家桶一键打通WorkBuddy(附教程)
后端
GIS数据转换器6 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts