日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

發布時間:2025/3/16 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自從 JDK9 之后,每年 3 月與 9 月 JDK 都會發布一個新的版本,而2020 年 9 月即將引來 JDK15。

恰巧 IDEA 每四五個月會升級一個較大的版本,每次升級之后都會支持最新版本 JDK 引入的新功能。

這幾天升級了 IDEA,順便體驗了一下 JDK15 的新特性。

雖然我知道你們可能跟我一樣JDK8 都還沒用熟,但是無妨,看看新版本 JDK 來酸一下。


Text Blocks?最終定版

之前版本的 JDK,如果我們需要插入 HTMLXMLSQLJSON 片段,非常麻煩,需要對里面符號進行各種轉義。

所以我每次都會在其他編輯器將 HTML ,XML 等編輯好,然后直接復制到 IDEA 中,IDEA 自動會對這些字符轉義。

每次復制進去就變成上圖的效果,如果上面字符再多點,閱讀起來就會更難,并且難以維護。

所幸 IDEA 提供了一個 Inject Language 功能,我們可以在里面快速方便的編輯。

Java 開發者也關注到這個問題,他們在 JDK13 引入的一個新的預覽特性「Text Blocks」,可以使用三引號將復雜的字符串賦值,從而讓我們從各種轉義中解脫出來,可以更加方便的編輯字符串。

這個功能在其他語言還是比較常見的,比如 Python 等。

Text Blocks 新功能在 JDK14 再次以預覽功能引入,最終在 JDK15 成為新版本的正式功能。

下面我們來對比一下使用 Text Blocks 與之前區別:

HtmlSQLJS

Records?(Second Preview)

JDK14 引入一個新的預覽特性 record 語法,可以快速創建一個純數據類,并且不用去生成 gettertoString 等。

使用下面的語法就可以快速創建一個數據類:

public?record?Point(int?x,int?y)?{ }

JDK15 是 record 這個語法的第二次預覽,這個版本增加一個新的功能 「local record」,可以在一個方法在快速創建一個類,以便于方法中業務邏輯計算。

在以下示例中,使用本地記錄 MerchantSales 對商人和每月銷售額的匯總進行建模,使用此記錄可提高以下流操作的可讀性:

下面例子的中我們新建一個類 MerchantSales,然后按照銷售人員對每月的銷售額匯總排序。

List<Merchant>?findTopMerchants(List<Merchant>?merchants,?int?month)?{//?Local?recordrecord?MerchantSales(Merchant?merchant,?double?sales)?{}return?merchants.stream().map(merchant?->?new?MerchantSales(merchant,?computeSales(merchant,?month))).sorted((m1,?m2)?->?Double.compare(m2.sales(),?m1.sales())).map(MerchantSales::merchant).collect(toList()); }

原先如果需要使用這種功能,我們不得不創建一個內部類,后續可能再也不會用到,使用 local record就解決這個尷尬的問題。

除了 ?local record 我們還可以創建 local enums 以及 local interface

//?local?enums public?void?organisePeople(List<Person>?people)?{enum?Role?{Employee,?Customer,?Both,?None}HashMap<Role,?List<Person>>?peopleByRole?=?new?HashMap<>();people.stream().filter(Person::isCustomer).forEach(person?->?peopleByRole.computeIfAbsent(Role.Customer,?role?->?new?ArrayList<>()).add(person));//?其他業務邏輯} //?local?interface public?void?localInterface()?{interface?MyInterface?{void?doSomething();}MyInterface?testInterface?=?new?MyInterface()?{@Overridepublic?void?doSomething()?{System.out.println("Hello?World!");}};//?其他業務邏輯}

最后使用這個特性需要注意一點,local record , local enums ,local interface 創建都是一個局部變量,是不能被傳遞其他方法引用。

Pattern Matching for instanceof?(Second Preview)

我們應該都看到過下面這種代碼:

if?(obj?instanceof?String)?{String?str?=?(String)?obj;//?use?str }

上面代碼意圖非常簡單,當 obj 對象是 String 類,就將其強制轉換,然后進行其他業務操作。

這種寫法,類型轉換還是比較繁瑣,Pattern Matching for instanceof ?這個新語法特性,可以幫我們省略這種類型轉換動作。這是一個在 JDK14 引入一個預覽特性,JDK 15 開始第二次預覽。

上面的代碼使用 pattern matcher,就可以被修改如下:

if?(obj?instanceof?String?s)?{s.contains("T"); }?else?{//?編譯錯誤//s.contains("T"); }

另外如果在 IDEA 中還可以提示我們將代碼轉化成 pattern matcher

大家應該都看過 Effective Java 這本神書吧,里面第八條關于 Equals 有一個例子:

使用 pattern matcher 我們就可以使用下面更加清晰的代碼代替:

Sealed?Classes?(Preview)

Java 中一個正常普通類/接口允許被其他子類繼承/實現,但是有時在日常開發中,我們可能希望只有特定的類才能繼承擴展。

現有的 Java 語法中存在一些方法,可以限制子類擴展,比如說:我們可以使用 final 修飾類

public?final?class?String

不過這樣之后,我們就沒辦法再繼承這個類。

其次我們可以限制的類的范圍,比如說不使用 public 修飾類/接口,即使用 default 范圍,這樣只有同一個包才能繼承/實現。

interface?DefaultExample?{ }

不過使用這種方式,又很尷尬,這個類就無法被其他包使用。

為了解決上述問題,JDK 15 引入一個新的預覽特性 Sealed Classes,即可以限定類的擴展,也可以被外部使用。

public?sealed?class?Shapepermits?Circle,?Rectangle,?Square?{...}

使用 sealed 修飾之后,Shape 類只能被 Circle,Rectangle,Square繼承,再也不能被其他類繼承。

同時 Shape 的子類存在一些限制,必須使用 final 修飾,表明這個類無法再被擴展:

public?final?class?Circle?extends?Shape?{...}

或者繼續使用 sealed 表示子類只能被指定類繼承:

public?sealed?class?Rectangle?extends?Shape?permits?TransparentRectangle,?FilledRectangle?{...} public?final?class?TransparentRectangle?extends?Rectangle?{...}

又或者說使用 non-sealed 表明這個子類不限制子類擴展,可以被其他任何類擴展實現。

另外 sealed class 還可以跟上述 record 語法一起使用。

public?sealed?interface?Exprpermits?ConstantExpr,?PlusExpr,?TimesExpr,?NegExpr?{...}public?record?ConstantExpr(int?i)???????implements?Expr?{...} public?record?PlusExpr(Expr?a,?Expr?b)??implements?Expr?{...} public?record?TimesExpr(Expr?a,?Expr?b)?implements?Expr?{...} public?record?NegExpr(Expr?e)???????????implements?Expr?{...}

ZGC

ZGC(Z Garbage Collector) 這是一款在 JDK11 引入的的具有實驗性質的低延遲的 GC 收集器。

這款 GC 收集器的希望在盡可能對吞吐量影響不大的前提下,實現在任意堆內存大小都可以把垃圾收集器的停頓時間限制在十毫秒以內的低延遲。

ZGC 經過這兩三年的迭代優化,終于在 JDK15 中正式引入,標志著 ZGC 可以正式應用于生產應用。

JDK15 中默認虛擬機還是 G1,如果需要使用 ZGC,需要在啟動參數中加入如下參數:

-XX:+UseZGC?command-line?

最后

本來這篇文章是準備寫下 IDEA 2020.2 新版本特性,順帶介紹一下 JDK15 新特性的。

可是沒想到寫著寫著,JDK15 相關的篇幅就過長了,所以就單獨拿出來了。

最后,最后,JDK 都發布到 15 了,而我卻還在用 JDK 7 ,真是個悲傷的故事,逃了逃了!


參考鏈接

https://openjdk.java.net/projects/jdk/15/

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。