专业的JAVA编程教程与资源

网站首页 > java教程 正文

Switch 语句从 Java 7 到 Java 17 的演变

temp10 2024-09-07 20:13:10 java教程 8 ℃ 0 评论



概述

java7以来,java中的Switch语句经历了快速的演变。因此,在本文中,我们将举例讨论switch语句从java7java17的演变或变化。

Switch 语句从 Java 7 到 Java 17 的演变

让我们从初始java 7开始

Java 7: Switch语句

Java7之前,Switch语句的判断条件只能接受int,byte,char,short类型的参数,这是很长一段时间以来的标准:

int value = 5;
switch (value) {
    case 1:
        System.out.println("One");
        break;
    case 5:
        System.out.println("five");
        break;
    default:
        System.out.println("Unknown");
}

Java 8: Switch语句

Java8中,case值和switch语句开始演化时引入了字符串和枚举

字符串 Switch Case 语句举例:

String day = "Tuesday";
        switch (day) {
            case "Monday":
                System.out.println("Week day");
                break;
            case "Tuesday":
                System.out.println("Week day");
                break;
            case "Wednesday":
                System.out.println("Week day");
                break;
            case "Thursday":
                System.out.println("Week day");
                break;
            case "Friday":
                System.out.println("Week day");
                break;
            case "Saturday":
                System.out.println("Weekend");
                break;
            case "Sunday":
                System.out.println("Weekend");
                break;
            default:
                System.out.println("Unknown");
        }

枚举 Switch Case语句举例:

enum DAYS {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
DAYS days = DAYS.SUNDAY;
switch (days) {
    case MONDAY:
        System.out.println("Weekdays");
        break;
    case TUESDAY:
        System.out.println("Weekdays");
        break;
    case WEDNESDAY:
        System.out.println("Weekdays");
        break;
    case THURSDAY:
        System.out.println("Weekdays");
        break;
    case FRIDAY:
        System.out.println("Weekdays");
        break;
    case SATURDAY:
        System.out.println("Weekends");
        break;
    case SUNDAY:
        System.out.println("Weekends");
        break;
    default:
        System.out.println("Unknown");
}

Java 12: Switch语句

Java 12进一步增强了switch语句,并引入了switch表达式作为预览特性。

它引入了一系列新功能:

  • switch语句变成了switch表达式时,您可以从一个switch块中返回
  • case中可以有多个值
  • 您可以通过箭头操作符或break关键字从switch表达式返回值,通过break关键字返回值
return  switch (day) {
    case "Monday":
        break "Weekday";
    case "Tuesday":
        break "Weekday";
    case "Wednesday":
        break "Weekday";
    case "Thursday":
        break "Weekday";
    case "Friday":
        break "Weekday";
    case "Saturday":
        break "Weekend";
    case "Sunday":
        break "Weekend";
    default:
        break "Unknown";
};

break 关键字返回结果值

这个词后来在Java 13中被关键字"yield"取代。

return  switch (day) {
    case "Monday":
        yield  "Weekday";
    case "Tuesday":
        yield "Weekday";
    case "Wednesday":
        yield "Weekday";
    case "Thursday":
        yield "Weekday";
    case "Friday":
        yield "Weekday";
    case "Saturday":
        yield "Weekend";
    case "Sunday":
        yield "Weekend";
    default:
        yield "Unknown";
};

通过箭头操作符返回值

此外,Java 12引入了箭头操作符作为简单的替代,而不是使用break关键字返回值:

return  switch (day) {
            case "Monday"-> "Week day";
            case "Tuesday"-> "Week day";
            case "Wednesday"->"Week day";
            case "Thursday"->"Week day";
            case "Friday"->"Week day";
            case "Saturday"-> "Weekend";
            case "Sunday"-> "Weekend";
            default->"Unknown";
        };

多个case标签

同样,Java 12也可以在一个case语句中提供多个case值,所以如果你观察上面的例子,因为有5case在这里期望相同的值,所以我可以合并或合并多个case值为一个,如下所示

return  switch (day) {
            case "Monday","Tuesday","Wednesday","Thursday","Friday"
-> "Week day";
            case "Saturday", "Sunday" -> "Weekend";
            default->"Unknown";
        };

Java 14: Switch 语句的改变

我们在java 1213中讨论过的任何switch语句和特性,都是预览特性,需要将flag -enable-preview设置为true。但是Java 14让所有的特性都不再是预览特性。标志-enable-previewjava 14启动时不需要设置。并且switch语句已经演变成switch表达式!

#Java 17: Switch语句/表达式:

JDK 17已经发布,这是一个LTS( long-term support)版本,下一代的Spring Framework 6Spring Boot 32022下半年发布),也将基于JDK 17。由此可以推测,JDK 17可能会和JDK 8一样,也成为未来Java项目使用的主力版本。

所以,现在才开始学Java的,可以直接学用JDK 17。如果使用老版本学习资料进行学习,至少从JDK 8开始,而JDK 8之前的书,基本上都可以送废品收购站了。

开关表达特性

  1. 模式匹配
  2. Gaurded模式
  3. null case

模式匹配

它引入了一种新的开关特性,即模式匹配。您可以匹配case标签中的模式。 换句话说,你可以在switch条件下传递对象,这个对象可以在switch case标签中检查不同类型。

return switch (obj) {
    case Integer i -> "It is an integer";
    case String s -> "It is a string";
    case Employee s -> "It is a Employee";
     default -> "It is none of the known data types";
};

在上面的例子中,我将一个对象传递给switch条件。这在Java 17之前是不可能的。然后可以检查该对象是否具有特定的数据类型,并将其赋值给一个变量。

例如,考虑以下情况:

case Integer i- > "It is an integer";

传递的对象被检查类型为Integer,然后赋值给变量i,如果它是一个整数。通过箭头操作符返回字符串“It is an integer”。

Gaurded模式

让我们以这个用例为例。

在我检查了 Employee 实例的case标签内,我想做一个额外的检查。

传统上,你可以在案例陈述之后做这个。

是这样的:

case Employee emp:

if(emp.getDept().equals("IT")) {

yield "This is IT Employee";

}

switch预览版扩展了Java中的模式语言,允许switch针对多个模式测试表达式和语句,每个模式都有特定的操作。Java 17已经引入guarded模式,允许模式匹配逻辑用任意布尔表达式。您可以在case标签本身中进行检查,如下所示:

return switch (obj) {
    case Integer i -> "It is an integer";
    case String s -> "It is a string";
    case Employee employee && employee.getDept().equals("IT") -> "IT Employee";
    default -> "It is none of the known data types";
};

Null Case

Java 17之前,你不可能在不抛出空指针异常的情况下将空值传递给switch语句。

Java 17允许您这样处理它:

case null -> "它是一个空对象";

这就是从java 7java 17的转换过程。

希望你喜欢这篇文章,点赞并且关注,学习更多java以及大数据优质知识。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表