您现在的位置是:首页 > 正文

Java 12 –开关表达式

2024-02-01 04:29:29阅读 2
切换表达

Java 12, JEP 325:开关表达式增强了传统的switch语句,以支持以下新功能:

  • 多个案例标签
  • 开关表达式通过break返回值(在Java 13开关表达式中替换为yield
  • 通过标签规则切换表达式返回值(箭头)

PS Switch表达式是预览功能,默认情况下处于禁用状态。

一个传统的switch示例。

JEP325.java
package com.mkyong.java12;

public class JEP325 {

    public static void main(String[] args) {

        System.out.println(getTextBefore12(1));
        System.out.println(getTextBefore12(3));
        System.out.println(getTextBefore12(6));
        System.out.println(getTextBefore12(10));

    }

    // Traditional switch statement
    private static String getTextBefore12(int number) {
        String result = "";
        switch (number) {
            case 1:
            case 2:
                result = "one or two";
                break;
            case 3:
                result = "three";
                break;
            case 4:
            case 5:
            case 6:
                result = "four or five or six";
                break;
            default:
                result = "unknown";
        };
        return result;
    }

}

输出量

one or two
three
four or five or six
unknown

1.多个案例标签

现在,我们可以用逗号分隔的标签声明多个情况。

private static String getTextMultipleLabels(int number) {
        String result = "";
        switch (number) {
            case 1, 2:
                result = "one or two";
                break;
            case 3:
                result = "three";
                break;
            case 4, 5, 6:
                result = "four or five or six";
                break;
            default:
                result = "unknown";
        };
        return result;
    }

2.通过中断返回值

现在,此switch是一个表达式(返回值),也称为值中断。

private static String getTextViaBreak(int number) {
        String result = switch (number) {
            case 1:
            case 2:
                break "one or two"; 
            case 3:
                break "three";
            case 4:
            case 5:
            case 6:
                break "four or five or six";
            default:
                break "unknown";
        };
        return result;
    }

注意
该值中断被Java 13 yield关键字取代,请阅读此Java 13开关表达式

4.通过箭头返回值

我们还可以通过箭头或标签规则返回值。

private static String getTextViaArrow(int number) {
        String result = switch (number) {
            case 1, 2 -> "one or two";
            case 3 -> "three";
            case 4, 5, 6 -> "four or five or six";
            default -> "unknown";
        };
        return result;
    }

5.启用预览功能

5.1正常的javac编译将提示以下错误:

$ javac JEP325.java
JEP325.java:39: error: multiple case labels are a preview feature and are disabled by default.
            case 1, 2:
                    ^
  (use --enable-preview to enable multiple case labels)

JEP325.java:56: error: switch expressions are a preview feature and are disabled by default.
        String result = switch (number) {
                        ^
  (use --enable-preview to enable switch expressions)
JEP325.java:75: error: switch rules are a preview feature and are disabled by default.
            case 1, 2 -> "one or two";
                      ^
  (use --enable-preview to enable switch rules)
3 errors

5.2我们需要手动启用预览功能:

javac --enable-preview --release 12 Example.java
java --enable-preview Example

参考文献

翻译自: https://mkyong.com/java/java-12-switch-expressions/

网站文章

  • Tensorflow2 导入自定义预训练模型

    网上大多数都是直接调用tf的内置application中的预训练模型,这里用自己训练好的预训练模型。预训练模型的最后全连接层不要,只保留前面的捕捉特征的层且这些层权重冻结不参与接下来的训练。不冻结也可...

    2024-02-01 04:29:24
  • 被遗忘的SQLServer比较运算符修饰词

    SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和Any等价。官方的参考文档http://technet.microsoft.com/zh-cn/library/ms187074%28SQL.90%29.aspx 他们作用于比较运算符和子查询之间,作用类似Exists、not exists、in、not in以及其他逻辑意义,这些语法同

    2024-02-01 04:29:17
  • linux问题排查常用命令详解

    linux问题排查常用命令详解

    前阵子部署的服务器出现了故障,针对故障现场做了个排查,后来发现是nginx的quic分支代码的问题,出现了死循环导致CPU 近100%记录下在排查过程中使用的命令和

    2024-02-01 04:29:11
  • Git远程仓库配置SSH(以github为例)

    Git远程仓库配置SSH(以github为例)

    输入命令以及。 输入命令,查看配置是否正确。 输入命令。 然后连续敲三次回车,如果没问题你会看到如下界面 输入命令,查看生成的公钥。 也可以直接打开文件进行查看。 打开github,点击用户头像,再点...

    2024-02-01 04:28:42
  • idea 一键导包

    idea 一键导包 一键删除没有 的包,导入缺失的包 ctrl + alt + o

    2024-02-01 04:28:33
  • Session会话追踪的实现机制

    Session会话追踪的实现机制

    Session(会话)是Servlet中的一种特殊的机制,它可以用来存储K-V键值对,它的生命周期较长,在服务器关闭或Session失效和客户端浏览器关闭之前,Session中的数据都不会消失,而且每...

    2024-02-01 04:28:26
  • SSM整合相关知识

    SSM整合相关知识

    SSM整合时,classpath:与 jdbc.properties的使用

    2024-02-01 04:27:56
  • 腾讯云Linux 轻量应用服务器如何搭建 FTP 服务?

    腾讯云Linux 轻量应用服务器如何搭建 FTP 服务?

    如果您选择了 FTP 主动模式,请确保客户端机器已获取真实的 IP 地址,否则可能会导致客户端无法登录 FTP 服务器。1. 修改以下配置参数,设置匿名用户和本地用户的登录权限,设置指定例外用户列表文...

    2024-02-01 04:27:49
  • nginx 无证书代理https stream模块的ssl_preread on

    当启用 "ssl_preread on" 时,nginx 会在没有证书的情况下使用 Stream 模块代理 HTTPS 流量。这意味着 nginx 将在没有验证客户端证书的情况下转发流量,但是这种方法可能不够安全。 ...

    2024-02-01 04:27:42
  • 页面访问时发生错误: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    页面访问时发生错误: java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config在使用SpringMVC时,出现上述错误解决方法:将jstl-1.1.2.jar、standard-1.1.2.jar这2个jar包放到tomcat内的lib目录下,即可解决问题

    2024-02-01 04:27:13