从 JDK 8 到 JDK 17,Java 在语法上进行了许多改进和增强。以下是各个版本的主要语法升级:
JDK 8 (2014)
-
Lambda 表达式:
- 简化匿名内部类的写法,用于函数式编程。
(parameters) -> expression
-
函数式接口:
- 只有一个抽象方法的接口,可以使用
@FunctionalInterface
注解标注。
@FunctionalInterface interface MyFunction { void apply(); }
- 只有一个抽象方法的接口,可以使用
-
默认方法:
- 接口中可以有带实现的方法。
interface MyInterface { default void myMethod() { // implementation } }
-
静态方法:
- 接口中可以定义静态方法。
interface MyInterface { static void myStaticMethod() { // implementation } }
-
方法引用:
- 使用
::
关键字引用方法或构造函数。
MyClass::myMethod
- 使用
-
重复注解:
- 同一注解在同一声明上可以多次使用。
@Repeatable(Annotations.class) @interface MyAnnotation {}
-
Optional 类:
- 用于避免
null
值导致的NullPointerException
。
Optional<String> optional = Optional.of("value");
- 用于避免
JDK 9 (2017)
-
模块系统 (Project Jigsaw):
- 引入模块化系统,定义模块间的依赖关系。
module my.module { requires another.module; }
-
接口私有方法:
- 接口中可以有私有方法。
interface MyInterface { private void myPrivateMethod() { // implementation } }
JDK 10 (2018)
-
局部变量类型推断:
- 使用
var
关键字进行局部变量类型推断。
var list = new ArrayList<String>();
- 使用
JDK 11 (2018)
-
局部变量类型推断增强:
- 允许在 lambda 表达式中使用
var
。
(var x, var y) -> x + y
- 允许在 lambda 表达式中使用
-
字符串增强:
- 增加了一些字符串处理的方法,如
isBlank()
、lines()
、repeat()
等。
"Hello\nWorld".lines().forEach(System.out::println);
- 增加了一些字符串处理的方法,如
JDK 12 (2019)
-
Switch 表达式(预览特性):
- Switch 语句可以返回值,并且可以使用 lambda 表达式风格。
var result = switch (day) { case MONDAY -> "Start of the week"; case FRIDAY -> "End of the week"; default -> "Midweek"; };
JDK 13 (2019)
-
Switch 表达式增强(第二次预览):
- 继续改进 Switch 表达式。
-
文本块(预览特性):
- 多行字符串文字,使用三个双引号。
String json = """ { "name": "John", "age": 30 } """;
JDK 14 (2020)
-
Switch 表达式:
- Switch 表达式正式成为标准特性。
-
文本块(第二次预览):
- 进一步改进文本块。
-
instanceof 模式匹配(预览特性):
- 简化类型检查和转换。
if (obj instanceof String s) { System.out.println(s.length()); }
JDK 15 (2020)
-
文本块:
- 文本块正式成为标准特性。
-
隐藏类(隐式类):
- 允许动态生成和加载类。
-
Sealed 类(预览特性):
- 限制哪些类可以扩展或实现。
public sealed class Shape permits Circle, Rectangle {}
JDK 16 (2021)
-
记录类(Record):
- 简化数据载体类的声明。
public record Point(int x, int y) {}
-
instanceof 模式匹配:
- 模式匹配正式成为标准特性。
-
Sealed 类(第二次预览):
- 继续改进 Sealed 类。
JDK 17 (2021)
-
Sealed 类:
- Sealed 类和接口正式成为标准特性。
public sealed class Shape permits Circle, Rectangle {}
JDK 18 (2022)
- UTF-8默认字符集:将默认字符集更改为UTF-8。
- 简单的Web服务器:引入一个简单的Web服务器用于开发和测试。
JDK 19 (2022)
- 记录模式(预览特性):引入了记录模式,用于解构记录类。
- Switch模式匹配(第二次预览):继续增强Switch模式匹配功能。
JDK 20 (2023)
- 范围模式(预览特性):引入范围模式,用于更灵活的模式匹配。
- 结构化并发(预览特性):引入用于简化并发编程的结构化并发API。
JDK 21 (2023)
-
字符串模板:引入字符串模板,用于更简洁地嵌入和处理字符串。
String name = "John"; int age = 30; String message = STR."Hello, \{name}! You are \{age} years old."; System.out.println(message); // 输出: Hello, John! You are 30 years old.
记录模式:记录模式正式成为语言的一部分。
通用实例of模式匹配:增强了类型检查和转换的灵活性。
小结
从 JDK 8 到 JDK 21,Java 引入了许多新的语法特性,以提高代码的简洁性、可读性和安全性。主要包括 lambda 表达式、方法引用、模块系统、局部变量类型推断、文本块、switch 表达式、记录类、模式匹配和封闭类等。这些改进使得 Java 语言更加现代化,更加适应当前软件开发的需求。