從 JDK 8 到 JDK 17,Java 在語法上進(jìn)行了許多改進(jìn)和增強(qiáng)蔚润。以下是各個(gè)版本的主要語法升級:
JDK 8 (2014)
-
Lambda 表達(dá)式:
- 簡化匿名內(nèi)部類的寫法,用于函數(shù)式編程抽碌。
(parameters) -> expression
-
函數(shù)式接口:
- 只有一個(gè)抽象方法的接口,可以使用
@FunctionalInterface
注解標(biāo)注决瞳。
@FunctionalInterface interface MyFunction { void apply(); }
- 只有一個(gè)抽象方法的接口,可以使用
-
默認(rèn)方法:
- 接口中可以有帶實(shí)現(xiàn)的方法。
interface MyInterface { default void myMethod() { // implementation } }
-
靜態(tài)方法:
- 接口中可以定義靜態(tài)方法皮胡。
interface MyInterface { static void myStaticMethod() { // implementation } }
-
方法引用:
- 使用
::
關(guān)鍵字引用方法或構(gòu)造函數(shù)。
MyClass::myMethod
- 使用
-
重復(fù)注解:
- 同一注解在同一聲明上可以多次使用屡贺。
@Repeatable(Annotations.class) @interface MyAnnotation {}
-
Optional 類:
- 用于避免
null
值導(dǎo)致的NullPointerException
。
Optional<String> optional = Optional.of("value");
- 用于避免
JDK 9 (2017)
-
模塊系統(tǒng) (Project Jigsaw):
- 引入模塊化系統(tǒng)甩栈,定義模塊間的依賴關(guān)系。
module my.module { requires another.module; }
-
接口私有方法:
- 接口中可以有私有方法量没。
interface MyInterface { private void myPrivateMethod() { // implementation } }
JDK 10 (2018)
-
局部變量類型推斷:
- 使用
var
關(guān)鍵字進(jìn)行局部變量類型推斷。
var list = new ArrayList<String>();
- 使用
JDK 11 (2018)
-
局部變量類型推斷增強(qiáng):
- 允許在 lambda 表達(dá)式中使用
var
殴蹄。
(var x, var y) -> x + y
- 允許在 lambda 表達(dá)式中使用
-
字符串增強(qiáng):
- 增加了一些字符串處理的方法究抓,如
isBlank()
袭灯、lines()
、repeat()
等稽荧。
"Hello\nWorld".lines().forEach(System.out::println);
- 增加了一些字符串處理的方法究抓,如
JDK 12 (2019)
-
Switch 表達(dá)式(預(yù)覽特性):
- Switch 語句可以返回值,并且可以使用 lambda 表達(dá)式風(fēng)格姨丈。
var result = switch (day) { case MONDAY -> "Start of the week"; case FRIDAY -> "End of the week"; default -> "Midweek"; };
JDK 13 (2019)
-
Switch 表達(dá)式增強(qiáng)(第二次預(yù)覽):
- 繼續(xù)改進(jìn) Switch 表達(dá)式。
-
文本塊(預(yù)覽特性):
- 多行字符串文字构挤,使用三個(gè)雙引號髓介。
String json = """ { "name": "John", "age": 30 } """;
JDK 14 (2020)
-
Switch 表達(dá)式:
- Switch 表達(dá)式正式成為標(biāo)準(zhǔn)特性筋现。
-
文本塊(第二次預(yù)覽):
- 進(jìn)一步改進(jìn)文本塊。
-
instanceof 模式匹配(預(yù)覽特性):
- 簡化類型檢查和轉(zhuǎn)換矾飞。
if (obj instanceof String s) { System.out.println(s.length()); }
JDK 15 (2020)
-
文本塊:
- 文本塊正式成為標(biāo)準(zhǔn)特性。
-
隱藏類(隱式類):
- 允許動態(tài)生成和加載類洒沦。
-
Sealed 類(預(yù)覽特性):
- 限制哪些類可以擴(kuò)展或?qū)崿F(xiàn)。
public sealed class Shape permits Circle, Rectangle {}
JDK 16 (2021)
-
記錄類(Record):
- 簡化數(shù)據(jù)載體類的聲明申眼。
public record Point(int x, int y) {}
-
instanceof 模式匹配:
- 模式匹配正式成為標(biāo)準(zhǔn)特性瞒津。
-
Sealed 類(第二次預(yù)覽):
- 繼續(xù)改進(jìn) Sealed 類括尸。
JDK 17 (2021)
-
Sealed 類:
- Sealed 類和接口正式成為標(biāo)準(zhǔn)特性。
public sealed class Shape permits Circle, Rectangle {}
JDK 18 (2022)
- UTF-8默認(rèn)字符集:將默認(rèn)字符集更改為UTF-8濒翻。
- 簡單的Web服務(wù)器:引入一個(gè)簡單的Web服務(wù)器用于開發(fā)和測試。
JDK 19 (2022)
- 記錄模式(預(yù)覽特性):引入了記錄模式有送,用于解構(gòu)記錄類。
- Switch模式匹配(第二次預(yù)覽):繼續(xù)增強(qiáng)Switch模式匹配功能雀摘。
JDK 20 (2023)
- 范圍模式(預(yù)覽特性):引入范圍模式裸删,用于更靈活的模式匹配阵赠。
- 結(jié)構(gòu)化并發(fā)(預(yù)覽特性):引入用于簡化并發(fā)編程的結(jié)構(gòu)化并發(fā)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.
記錄模式:記錄模式正式成為語言的一部分轧铁。
通用實(shí)例of模式匹配:增強(qiáng)了類型檢查和轉(zhuǎn)換的靈活性。
小結(jié)
從 JDK 8 到 JDK 21齿风,Java 引入了許多新的語法特性药薯,以提高代碼的簡潔性救斑、可讀性和安全性。主要包括 lambda 表達(dá)式脸候、方法引用穷娱、模塊系統(tǒng)、局部變量類型推斷泵额、文本塊、switch 表達(dá)式嫁盲、記錄類篓叶、模式匹配和封閉類等羞秤。這些改進(jìn)使得 Java 語言更加現(xiàn)代化,更加適應(yīng)當(dāng)前軟件開發(fā)的需求瘾蛋。