zoukankan      html  css  js  c++  java
  • Java 14 祭出增强版 switch,真香!!

    Java14:栈长,我还有机会吗?

    栈长:必须有!今天说下switch!

    关注Java技术栈公众号的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时候,栈长也第一时间对 switch 特性进行了分享:

    Java 12 骚操作, switch居然还能这样玩!

    现在随着 JDK 14 的发布,switch已经成为标准特性了,意外的是对 JDK 12 又进行了一些调整和增强,现在我们来看 Java 14 中的 switch 怎么玩吧。

    本文是 Java 14 新特性的第 4 篇教程,也是对 JDK 12 switch 那篇的增强和修订!

    Java 14 switch

    Java 14 switch 有以下几点特色:

    1、箭头表达式

    箭头语法 ->,类似 Java 8 中的 Lambda 表达式,先来定义一个枚举类:

    public enum Status {
        OPEN, INIT, PROCESS, PENDING, CLOSE;
    }
    

    传统的写法:

    private static void test(Status status) {
        int result = 0;
        switch (status) {
            case OPEN:
                result = 1;
                break;
            case PROCESS:
                result = 2;
                break;
            case PENDING:
                result = 2;
                break;
            case CLOSE:
                result = 3;
                break;
            default:
                throw new RuntimeException("状态不正确");
        }
        System.out.println("result is " + result);
    }
    

    Java 14+ 后可以这样用:

    private static void test(Status status) {
        var result = switch (status) {
            case OPEN -> 1;
            case PROCESS, PENDING -> 2;
            case CLOSE -> 3;
            default -> throw new RuntimeException("状态不正确");
        };
        System.out.println("result is " + result);
    }
    

    可以在 switch 语句块中返回值给一个变量(不是必须),多个 case 条件可以写在一行,用逗号分开,并且可以省略 break 关键字。

    2、yield 关键字

    yield 用来返回值,并跳出当前 switch 语句块,来看下面的示例:

    private static void test(Integer value) {
        int number = switch (value) {
            case 3:
                System.out.println("3");
                yield 3;
            case 5:
                System.out.println("5");
                yield 5;
            default:
                System.out.println("default");
                yield 0;
        };
        System.out.println(number);
    }
    

    示例中,每个 case 都带了一个 yield 关键字返回值,也可以结合箭头表达式同时使用:

    private static void test(Status status) {
        var result = switch (status) {
            case OPEN -> 1;
            case PROCESS, PENDING -> 2;
            case CLOSE -> {
                System.out.println("closed");
                yield 3;
            }
            default -> throw new RuntimeException("状态不正确");
        };
        System.out.println("result is " + result);
    }
    

    示例代码看了都懂吧,是不是很骚?

    背后的秘密

    背后的秘密是什么呢?

    反编译上面那个例子的字节码再看下:

    private static void test(Status status) {
        byte var10000;
        switch(status) {
        case OPEN:
            var10000 = 1;
            break;
        case PROCESS:
        case PENDING:
            var10000 = 2;
            break;
        case CLOSE:
            System.out.println("closed");
            var10000 = 3;
            break;
        default:
            throw new RuntimeException("状态不正确");
        }
    
        int result = var10000;
        System.out.println("result is " + result);
    }
    

    可以看到全部是传统写法了,原来又是一个语法糖。

    好了,今天的分享就到这,收藏转发一下吧,虽然现在 JDK 8 是主流,但多学习了解不是坏事,日后必定有用!

    想学习更多的 Java 8 ~ 14 系列新特性教程,请搜索关注微信公众号:Java技术栈,在公众号后台回复:java,我写了一大堆教程了,都是干货。

    关注公众号Java技术栈回复"面试"获取我整理的2020最全面试题及答案。

    推荐去我的博客阅读更多:

    1.Java JVM、集合、多线程、新特性系列教程

    2.Spring MVC、Spring Boot、Spring Cloud 系列教程

    3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

    4.Java、后端、架构、阿里巴巴等大厂最新面试题

    觉得不错,别忘了点赞+转发哦!

  • 相关阅读:
    记素质拓展
    操场边的人
    ASP.NET MVC FileResult介绍
    SQL SERVER 数据类型详解
    ASP.NET 使用Response.WriteFile方法下载文件
    Java 静态代理和动态代理
    单例模式
    设计模式六原则
    Python 单例模式
    JAVA WEB 中涉及的编解码
  • 原文地址:https://www.cnblogs.com/javastack/p/13265429.html
Copyright © 2011-2022 走看看