JDK14新特性之switch表达式的实现

简介

switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Switch Expressions (Standard)。

其实Switch新增的功能有两个,一个就是可以连写case,一个就是switch可以带返回值了。

写在前面

就在我兴致勃勃的想要创建一个以switch命名的package的时候,突然间发现在IDEA中居然创建不java类了。

经过我的再三尝试,反复改名,终于被我发现了隐藏在里面的小秘密:

java key word是不能被用在package名字中的。好吧,一直以来package的名字就那么多个,现在想创建一个拉风一点的,居然发现还有这样一个规则。

那么java key word有哪些呢? 下面就是了。

连写case

先看一个老版本的例子:

 @Test
 public void useOldSwitch(){
  switch (MONDAY) {
   case MONDAY:
   case FRIDAY:
   case SUNDAY:
    System.out.println(6);
    break;
   case TUESDAY:
    System.out.println(7);
    break;
   case THURSDAY:
   case SATURDAY:
    System.out.println(8);
    break;
   case WEDNESDAY:
    System.out.println(9);
    break;
  }
 }

上面的例子中,我们想要匹配所有的星期,然后打印出相应的结果。写了很多个case语句,不美观。

再看一下新版本的例子:

 @Test
 public void useNewSwitch(){
  switch (MONDAY) {
   case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
   case TUESDAY    -> System.out.println(7);
   case THURSDAY, SATURDAY  -> System.out.println(8);
   case WEDNESDAY    -> System.out.println(9);
  }
 }

一个漂亮的连写,将一切都带走。

注意这里switch语句没有返回值,所以并不需要default语句。

switch返回值

考虑一个在switch中赋值的情况:

 @Test
 public void oldSwitchWithReturnValue(){
  int numLetters;
  switch (MONDAY) {
   case MONDAY:
   case FRIDAY:
   case SUNDAY:
    numLetters = 6;
    break;
   case TUESDAY:
    numLetters = 7;
    break;
   case THURSDAY:
   case SATURDAY:
    numLetters = 8;
    break;
   case WEDNESDAY:
    numLetters = 9;
    break;
   default:
    throw new IllegalStateException("这天没发见人!");
  }
 }

传统方式我们需要定义一个局部变量,并在case中给这个局部变量赋值。

我们看下怎么使用新版的switch替换:

 @Test
 public void newSwitchWithReturnValue(){
  int numLetters = switch (MONDAY) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY    -> 7;
   case THURSDAY, SATURDAY  -> 8;
   case WEDNESDAY    -> 9;
   default -> throw new IllegalStateException("这天没发见人!");
  };
 }

是不是非常简单。

注意,这里需要一个default操作,否则会报编译错误。因为可能存在未遍历的值。

yield

上面的switch返回值的情况,如果case后面的表达式比较复杂,那么就需要使用大括号来围起来。这种情况我们需要使用到yield来返回要返回的值。

 @Test
 public void withYield(){
  int result = switch (MONDAY) {
   case MONDAY: {
    yield 1;
   }
   case TUESDAY: {
    yield 2;
   }
   default: {
    System.out.println("不是MONDAY,也不是TUESDAY!");
    yield 0;
   }
  };
 }

1.case L -> 标签取消了贯穿功能 case后面的常量可以使用逗号来分割多个常量

看下代码

public class SwitchTest {
  public static void main(String[] args) {
    Weekday day = Weekday.MON; //初始化一个枚举变量
    //case L:标签具有贯穿功能
    switch (day){//不需要break;
      case MON, TUE, WEN -> {
        System.out.println("上半周");
        String s = "abc"; //局部变量只在当前代码块有效
      }
      case THU, FRI   -> {
        System.out.println("下半周");
        String s = "def";
      }
      case SAT, SUN   -> {
        System.out.println("周末");
      }
    }
    System.out.println("12");
}

//定义枚举
enum Weekday{
  MON,TUE,WEN,THU,FRI,SAT,SUN
}

运行结果:
上半周
12

2.JDK14中扩展了switch可以作为表达式进行赋值或打印操作

public class SwitchTest {
  public static void main(String[] args) {
    Weekday day = Weekday.MON; //初始化一个枚举变量

    //JDK14中扩展了switch可以作为表达式
    //将表达式的值打印出来
    System.out.println(switch(day){
      case MON, TUE, WEN -> "上半周";
      case THU, FRI   -> "下半周";
      case SAT, SUN   -> "周末";
    });

    //将表达式的值赋值给一个变量
    String text = switch(day){
      case MON, TUE, WEN -> "上半周";
      case THU, FRI   -> "下半周";
      case SAT, SUN   -> "周末";
    };

    //通过yield产生一个新的值
    day = Weekday.SAT;
    int x = switch(day){
      case MON, TUE, WEN -> 1;
      case THU, FRI   -> 2;
      case SAT, SUN   -> {
        int rnd = (int)(Math.random()*10); //生成一个(0,10)内的随机整数
        System.out.println("rnd = " + rnd);
        yield rnd; //通过yield产生一个新的值
      };
    };

    System.out.println("x = " + x);
  }
}

//定义枚举
enum Weekday{
  MON,TUE,WEN,THU,FRI,SAT,SUN
}

总结

本文介绍了JDK14中的switch新特性。也是唯一正式版本的新特性....

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

到此这篇关于JDK14新特性之switch表达式的实现的文章就介绍到这了,更多相关JDK14 switch表达式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • js 中的switch表达式使用示例

    前言 switch 这种表达式在很多语言中都有,比如java, C等待, 使用switch比使用if else 来得方便,来得清晰. 使用语法很简单: 复制代码 代码如下: switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case 1 和 case 2 不同时执行的代码 } 各种语言的使用基本类似. 需要特别提出的时,在java 1.6 及以下版本, 变量(n)只能是整型.在java 7 之后支持Str

  • JDK14新特性之switch表达式的实现

    简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Switch Expressions (Standard). 其实Switch新增的功能有两个,一个就是可以连写case,一个就是switch可以带返回值了. 写在前面 就在我兴致勃勃的想要创建一个以switch命名的package的时候,突然间发现在IDEA中居然创建不java类了. 经过我的再三尝试,反复改名,终于被我发现了隐藏在里面的小秘密: java k

  • 浅析C++11新特性的Lambda表达式

    lambda简介 熟悉Python的程序员应该对lambda不陌生.简单来说,lambda就是一个匿名的可调用代码块.在C++11新标准中,lambda具有如下格式: [capture list] (parameter list) -> return type { function body } 可以看到,他有四个组成部分: 1.capture list: 捕获列表 2.parameter list: 参数列表 3.return type: 返回类型 4.function body: 执行代码

  • 深入浅析JDK8新特性之Lambda表达式

    第一次是接触Lambda表达式是在TypeScript中(JavaScript的超集中),当时是为了让TypeScript的this方法外而不是本方法内所使用的.使用过后突然想到Lambda不是JDK8的重量级新特性么?于是感觉查阅相关资料并记录下来: 一. 行为参数化 行为参数化简单的说就是函数的主体仅包含模板类通用代码,而一些会随着业务场景而变化的逻辑则以参数的形式传递到函数之中,采用行为参数化可以让程序更加的通用,以应对频繁变更的需求. 考虑一个业务场景,假设我们需要通过程序对苹果进行筛选

  • Java8新特性:Lambda表达式之方法引用详解

    1.方法引用简述 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法.方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文.计算时,方法引用会创建函数式接口的一个实例. 当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些.方法引用是一种更简洁易懂的Lambda表达式. Lambda表达式全文详情地址:http://blog.csdn.net/sun_promise/article/details/

  • Java8新特性之Lambda表达式的使用

    1. lambda表达式介绍 lambda表达式是Java8提供的新特性之一,也可以称之为闭包:它支持Java能够进行简单的函数式编程,也就是说可以把一个匿名函数作为一个方法的参数进行传递:其格式分为三部分,第一部分为入参列表,第二部由->固定组成,第三部分为方法体: public class LambdaTest { public static void main(String[] args) { // 使用lambda表达式创建线程 Thread thread = new Thread(()

  • 简单易懂的java8新特性之lambda表达式知识总结

    一.概念 从本质上来说,它就是一个匿名函数,可以用来直接实现接口中的方法,从而简化代码.但是Lambda有一个限制,不能实现接口中的所有方法,所以Lambda表达式只能用于有且仅有一个必须需要实现的方法接口,这里需要注意必须需要实现这六个字. public interface Printer { //有一个需要实现的方法,可以使用Lambda表达式 void print(); } public interface Printer { //有一个需要实现的方法,可以使用Lambda表达式 void

  • 深入理解Java8新特性之Lambda表达式的基本语法和自定义函数式接口

    1.写在前面 目前我们学习Java主要用到的应该就是Java8了,或者说大部分企业当前使用的也是Java8.那么既然Java8的应用如此之广泛,一定有一些亮点所在: Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期API 其他新特性 速度更快.代码更少(增加了新的语法 Lambda 表达式).强大的 Stream API.便于并行.最大化减少空指针异常 Optional. 2.为什么要使用Lambda表达式? Lambda 是一

  • Java8新特性之Lambda表达式浅析

    说到java 8,首先会想到lambda(闭包)以及虚拟扩展方法(default method),这个特性早已经被各大技术网站炒得沸沸扬扬了,也是我们java 8系列开篇要讲的第一特性(JEP126 http://openjdk.java.net/jeps/126),jdk8的一些库已经应用了lambda表达式重新设计了,理解他对学习java 8新特性有着重要的意义. 一.函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是

  • Java中JDK14的新特性之JFR,JMC和JFR事件流(推荐)

    简介 Java Flight Recorder(JFR)是JVM的诊断和性能分析工具.它可以收集有关JVM以及在其上运行的Java应用程序的数据.JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小,我们可以放心的使用它. 一般来说,在使用默认配置的时候,性能影响要小于1%. JFR的历史很久远了.早在Oracle2008年收购BEA的时候就有了.JFR一般和JMC(Java Mission Control)协同工作. JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进

  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本.非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部

随机推荐