【java17】java17新特性之switch表达式

Java17版本中switch表达式将允许switch有返回值,并且可以直接作为结果赋值给一个变量,等等一系列的变化。

下面有一个switch例子,依赖于给定的枚举值,执行case操作,故意省略break。

java 复制代码
package com.morris.java17;

/**
 * switch省略break
 */
public class SwitchNotBreakDemo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season;
        switch (month) {
            case DECEMBER:
            case JANUARY:
            case FEBRUARY:
                season = "winter";
            case MARCH:
            case APRIL:
            case MAY:
                season = "spring";
            case JUNE:
            case JULY:
            case AUGUST:
                season = "summer";
            case SEPTEMBER:
            case OCTOBER:
            case NOVEMBER:
                season = "autumn";
            default:
                season = "unknown";
        }
        System.out.println(season); // unknown
    }
}

运行结果如下:

shell 复制代码
unknown

显然这不是期望的结果,因为我们需要在每个case里添加break防止所有的case都被执行。

java 复制代码
package com.morris.java17;

/**
 * switch增加break
 */
public class SwitchBreakDemo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season;
        switch (month) {
            case DECEMBER:
            case JANUARY:
            case FEBRUARY:
                season = "winter";
                break;
            case MARCH:
            case APRIL:
            case MAY:
                season = "spring";
                break;
            case JUNE:
            case JULY:
            case AUGUST:
                season = "summer";
                break;
            case SEPTEMBER:
            case OCTOBER:
            case NOVEMBER:
                season = "autumn";
                break;
            default:
                season = "unknown";
        }
        System.out.println(season); // unknown
    }
}

运行结果如下:

shell 复制代码
spring

可以通过switch表达式来进行简化。将冒号:替换为箭头->,并且switch表达式不需要break。

java 复制代码
package com.morris.java17;

/**
 * switch表达式
 */
public class SwitchExpressDemo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season;
        switch (month) {
            case DECEMBER, JANUARY, FEBRUARY -> season = "winter";
            case MARCH, APRIL, MAY -> season = "spring";
            case JUNE, JULY, AUGUST -> season = "summer";
            case SEPTEMBER, OCTOBER, NOVEMBER -> season = "autumn";
            default -> season = "unknown";
        }
        System.out.println(season); // spring
    }
}

switch表达式也可以返回一个值,比如上面的例子我们可以让switch返回一个字符串来表示我们要打印的文本。需要注意在switch语句的最后要加一个分号。

java 复制代码
package com.morris.java17;

/**
 * switch表达式带返回值的使用
 */
public class SwitchReturnDemo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season = switch (month) {
            case DECEMBER, JANUARY, FEBRUARY -> "winter";
            case MARCH, APRIL, MAY -> "spring";
            case JUNE, JULY, AUGUST -> "summer";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "autumn";
            default -> "unknown";
        };
        System.out.println(season); // spring
    }
}

如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。

java 复制代码
package com.morris.java17;

/**
 * switch表达式yield的使用
 */
public class SwitchYieldDemo {
    public static void main(String[] args) {
        Month month = Month.APRIL;
        String season = switch (month) {
            case DECEMBER, JANUARY, FEBRUARY -> "winter";
            case MARCH, APRIL, MAY -> {
                System.out.println("current season is spring");
                yield "spring";}
            case JUNE, JULY, AUGUST -> "summer";
            case SEPTEMBER, OCTOBER, NOVEMBER -> "autumn";
            default -> "unknown";
        };
        System.out.println(season); // spring
    }
}
相关推荐
程序员黑豆6 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
hey_sml7 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo7 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖9 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才9 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio9 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖10 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
不老刘11 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
离陌在学C#13 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山13 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端