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

相关推荐
稚辉君.MCA_P8_Java7 分钟前
JVM第二课:一文讲透运行时数据区
jvm·数据库·后端·容器
Elsa️7463 小时前
个人项目开发(1):使用Spring Secruity实现用户登录
java·后端·spring
麦芽糖02193 小时前
springboot集成ZeroMQ
java·spring boot·后端
大鱼七成饱3 小时前
Rust 多线程编程入门:从 thread::spawn 步入 Rust 并发世界
后端·rust
码事漫谈3 小时前
深入剖析:C++、C 和 C# 中的 static
后端
码事漫谈3 小时前
AI智能体全球应用调查报告:从“对话”到“做事”的变革
后端
绝无仅有4 小时前
某大厂跳动Java面试真题之问题与解答总结(二)
后端·面试·github
绝无仅有4 小时前
某大厂跳动Java面试真题之问题与解答总结(三)
后端·面试·架构
野犬寒鸦4 小时前
从零起步学习Redis || 第十章:主从复制的实现流程与常见问题处理方案深层解析
java·服务器·数据库·redis·后端·缓存
江上月5137 小时前
django与vue3的对接流程详解(上)
后端·python·django