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、后端、架构、阿里巴巴等大厂最新面试题

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

  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/javastack/p/13265429.html
Copyright © 2011-2022 走看看