Java 14 祭出增强版 switch,真香

Java 14 祭出增强版 switch,真香关注Java技术栈公众号的朋友应该都知道,switch 在 JDK 12 中进行增强了,并且在 JDK 12/13 中一直是预览特性,刚出来的时

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不仅依靠自身的努力,更要站在巨人的肩膀上,学习一些开源的源码的同时更应该多看看技术文档以及极技术视频;

正是由于前辈们的无私奉献和分享精神以及源源不断的技术开源才使得我们这些后浪轻易的获取更多优秀的学习资源,使得互联网行业迅速发展;这里,我也要做一个无私奉献的小程序员,我要做一个资源的传播者

大厂面试 真题

Java 14 祭出增强版 switch,真香

Java架构书籍

Java 14 祭出增强版 switch,真香

简历模板

Java 14 祭出增强版 switch,真香

领取步骤

1、关注,转发

2、私信发送:电子书

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/11887.html

(0)

相关推荐

  • 利用Python CFFI进行原子级别的C库调用

    利用Python CFFI进行原子级别的C库调用Python是一种高级语言,常用于快速开发、数据挖掘等领域,但有时候需要借助C库进行密集计算等操作。Python提供了很多种方式进行C库调用,例如ctypes、Swig等,但各种方式都存在一些问题。CFFI是Python官方推荐的C库调用方式,提供了原子级别的C库调用能力,一致性强,灵活性高,效率较高,已被广泛应用于NumPy、PyPy、Pillow等多个Python库。

    2024-06-30
    45
  • 用Python实现高效数据爬取

    用Python实现高效数据爬取互联网时代的到来让人们无时不刻不在接收和产生着海量的数据,如何实现高效数据的获取和信息提取已经成为了当今互联网行业最重要的工作之一。在这个过程中,数据爬取技术是至关重要的一环,Python作为一门较为常用的编程语言,有着很多优秀的爬虫框架和工具,使用Python编写代码能够有效地实现高效数据爬取。

    2024-04-21
    63
  • Python中的Finally语句

    Python中的Finally语句无论在什么编程语言中,错误处理都是一项必要的任务。在Python中,除了用try和except语句来处理代码块中的异常外,还有一个重要的语句:finally语句。finally语句表示不管try中的代码是否抛出异常,finally中的代码都会被执行。这使它比其他语句更加的强大。

    2024-05-28
    43
  • 简单工厂模式,工厂方法模式,抽象工厂模式「终于解决」

    简单工厂模式,工厂方法模式,抽象工厂模式「终于解决」著作权归作者所有。 工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象…

    2023-07-26
    129
  • Intellij IDEA2017.3永久激活方法[通俗易懂]

    Intellij IDEA2017.3永久激活方法[通俗易懂]随着idea不断地发展,eclipse的缺点日渐明显,为了能够获得良好的编码体验,越来越多的朋友转向了idea,淘汰了eclipse但是由于近期idea所有私人服务器被封杀了,很多喜欢编码的朋友们都陷入了一个问题,如何在不购买正品的情况重新激活自己的idea,小编也是个编程小白,但是很注重个人的代码体验,所以小编最近找到了一个新的方法,希望能够对大家有所帮助:1下载idea,此步骤小编就不再

    2023-03-23
    286
  • flink1.12 hive_flink docker

    flink1.12 hive_flink dockerApache Flink社区宣布Flink 1.10.0正式发布! 本次Release版本修复1.2K个问题,对Flink作业的整体性能和稳定性做了重大改进,同时增加了对K8S,Python的支持。

    2023-01-28
    143
  • 开源之夏 2022 与您相约[亲测有效]

    开源之夏 2022 与您相约[亲测有效]活动简介 “开源之夏(英文简称 OSPP)”是中科院软件所“开源软件供应链点亮计划”指导下的一项面向高校学生的暑期活动,由中国科学院软件研究所与openEuler社区共同举办。 2022年为此系列活动

    2023-05-12
    143
  • Python中namedtuple的使用

    Python中namedtuple的使用在Python中,有时需要自定义简单但是有名字的记录类型,如果使用字典或普通元组,通常会显得有点笨重。此时,strongnamedtuple/strong就成为了一个很好的选择。namedtuple是Python标准库collections中的一个函数,用于创建和实例化类似于元组的对象,但这些对象有名称,可以像字典一样通过名称来访问字段。namedtuple相当于一个轻量级的类定义器,它本质上是一个Python类,可以像其他类一样继承、实例化、序列化和扩展。

    2024-09-05
    7

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注