Switch语句从Java7到Java17的演变
概述
自 java7 以来,java 中的Switch 语句经历了快速的演变。因此,在本文中,我们将举例讨论switch 语句从java7 到java17 的演变或变化。
让我们从初始 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 值,所以如果你观察上面的例子,因为有5 个case 在这里期望相同的值,所以我可以合并或合并多个case 值为一个,如下所示return switch (day) { case "Monday","Tuesday","Wednesday","Thursday","Friday" -> "Week day"; case "Saturday", "Sunday" -> "Weekend"; default->"Unknown"; }; Java 14: Switch 语句的改变
我们在 java 12 和13 中讨论过的任何switch 语句和特性,都是预览特性,需要将flag -enable-preview 设置为true 。但是Java 14 让所有的特性都不再是预览特性。标志-enable-preview 在java 14 启动时不需要设置。并且switch 语句已经演变成switch 表达式!
#Java 17: Switch语句/表达式:
JDK 17 已经发布,这是一个LTS ( long-term support )版本,下一代的Spring Framework 6 和Spring Boot 3 (2022 下半年发布),也将基于JDK 17 。由此可以推测,JDK 17 可能会和JDK 8 一样,也成为未来Java 项目使用的主力版本。
所以,现在才开始学 Java 的,可以直接学用JDK 17 。如果使用老版本学习资料进行学习,至少从JDK 8 开始,而JDK 8 之前的书,基本上都可以送废品收购站了。
开关表达特性 模式匹配 Gaurded 模式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 7 到java 17 的转换过程。
希望你喜欢这篇文章,点赞并且关注,学习更多 java 以及大数据优质知识。