精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文了解Java 21的新功能

jf_ro2CN3Fa ? 來源:medium.com ? 2023-12-21 16:19 ? 次閱讀

來源:medium.com

JDK 21 于 2023 年 9 月 19 日發布,是繼之前的 LTS 版本 JDK 17 之后最新的長期支持 (LTS) 版本。在本文中,我們將探討 JDK 21 新引入的功能。

以下是 JDK 21 的新功能列表:

虛擬線程

序列集合

記錄模式

字符串模板(預覽)

未命名模式和變量(預覽)

未命名類和實例主要方法(預覽)

作用域值(預覽)

結構化并發(預覽)

1 虛擬線程

Java 代碼的角度來看,虛擬線程感覺就像普通線程,但它們沒有 1:1 映射到操作系統/平臺線程。它是從虛擬線程到載體線程進而到操作系統線程的M:N映射。

有一個所謂的載體線程池,虛擬線程臨時映射(“安裝”)到該線程池上。一旦虛擬線程遇到阻塞操作,虛擬線程就會從載體線程中移除(“卸載”),并且載體線程可以執行另一個虛擬線程(新的或之前被阻塞的虛擬線程)。

載體線程池是ForkJoinPool

d9d291e0-9740-11ee-8b88-92fbcf53809c.png

虛擬線程的一些優點:

提高應用程序吞吐量

提高應用程序可用性

減少內存消耗

創建虛擬線程

要創建虛擬線程,我們可以使用 Thread.ofVirtual() 工廠方法并傳遞可運行對象。

Thread.ofVirtual().start(Runnable);

Thread.ofVirtual().unstarted(Runnable);

如果你想讓虛擬線程立即啟動,你可以使用start() 方法,它會立即執行傳遞給它的Runnable start()。

如果不希望虛擬線程立即啟動,可以使用該unstarted()方法。

創建使用虛擬線程的ExecutorService

我們只需要替換newFixedThreadPool為newVirtualThreadPerTaskExecutor

importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;

publicclassVirtualThreadExample{

publicstaticvoidmain(String[]args){
ExecutorServiceexecutor=Executors.newVirtualThreadPerTaskExecutor();

executor.submit(()->{
System.out.println(Thread.currentThread().getName())
});

executor.shutdown();
}
}

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

2 順序集合

順序集合為我們提供了defined encounter order(是一種所見即所得的順序,含義是從隊列中取出元素的順序既是你存放該元素時候的順序),用于訪問第一個和最后一個元素并以相反的順序迭代。

這意味著我們可以在集合的兩端添加、檢索或刪除元素。

d9e8a2b4-9740-11ee-8b88-92fbcf53809c.png

publicinterfaceSequencedCollectionextendsCollection{
defaultvoidaddFirst(Ee){...}
defaultvoidaddLast(Ee){...}
defaultEgetFirst(){...}
defaultEgetLast(){...}
defaultEremoveFirst(){...}
defaultEremoveLast(){...}
SequencedCollectionreversed();
}

正如我們所看到的,除了reverse()之外的所有方法都是默認方法并提供默認實現。

這意味著現有的集合類(例如 ArrayList 和 LinkedList)都可以實現此接口,而無需更改其代碼。

ArrayListlist=newArrayList<>();
list.add(1);//[1]
list.addFirst(0);//[0,1]
list.addLast(2);//[0,1,2]
list.getFirst();//0
list.getLast();//2
list.reversed();//[2,1,0]

SequencedSet

SequencedSet 接口對于具有有序元素的 Set 非常有用,特別是當您必須執行某些操作(例如檢索或刪除第一個或最后一個索引處的元素)時。它還提供了一種反轉元素的方法。

您還需要知道兩個 SequencedSet 對象的比較與其他類型的 Set 相同,不依賴于元素順序。

interfaceSequencedSetextendsSet,SequencedCollection{
SequencedSetreversed();
}

LinkedHashSet 是 Set 的一個實現,它實現了 SequencedSet 接口。

因此,您可以使用 LinkedHashSet 來創建 SequencedSet。

Set 的其他實現(例如 HashSet 和 TreeSet)未實現該接口。

讓我們探索一些示例來演示如何訪問第一個和最后一個元素,以及如何使用反向函數:

SequencedSetvalues=newLinkedHashSet<>();
values.add("one");
values.add("two");
System.out.println(values);//[one,two]

values.addFirst("zero");
System.out.println(values);//[zero,one,two]
values.addFirst("one");
System.out.println(values);//[one,zero,two]

values.addLast("three");
System.out.println(values);//[one,zero,two,three]

values.removeFirst();
System.out.println(values);//[zero,two,three]

SequencedSetreversedSet=values.reversed();
System.out.println(reversedSet);//[three,two,zero]

booleanisEqual=values.equals(reversedSet);
System.out.println(isEqual);//true
System.out.println(values.hashCode());//612888
System.out.println(reversedSet.hashCode());//612888
System.out.println(values.hashCode()==reversedSet.hashCode());//true

SequencedMap

如果要使用 SequencedMap 中定義的新方法,則需要使用 Map 實現,例如 LinkedHashMap 或實現 SortedMap 的 Map。

HashMap 不利用 Sequenced Collections,因為它沒有定義 defined encounter order(是一種所見即所得的順序,含義是從隊列中取出元素的順序既是你存放該元素時候的順序)。

interfaceSequencedMapextendsMap{
SequencedMapreversed();
SequencedSetsequencedKeySet();
SequencedCollectionsequencedValues();
SequencedSet>sequencedEntrySet();
VputFirst(K,V);
VputLast(K,V);
EntryfirstEntry();
EntrylastEntry();
EntrypollFirstEntry();
EntrypollLastEntry();
}

在下面的示例中,正如您所看到的,我們可以通過firstEntry()和lastEntry()方法訪問第一個和最后一個元素。

pollFirstEntry()方法將刪除并返回第一個鍵值元素,如果映射為空,則返回 null。

此外,調用reverse()只會比較元素,而不依賴于它們的順序。

SequencedMapmyMap=newLinkedHashMap<>();
myMap.put("one",1);
myMap.put("two",2);
System.out.println(myMap);//{one=1,two=2}

EntryfirstEntry=myMap.firstEntry();
System.out.println(firstEntry);//one=1

EntrylastEntry=myMap.lastEntry();
System.out.println(lastEntry);//two=2

myMap.putFirst("zero",0);
System.out.println(myMap);//{zero=0,one=1,two=2}
myMap.putFirst("one",-1);
System.out.println(myMap);//{one=-1,zero=0,two=2}

EntrypolledFirstEntry=myMap.pollFirstEntry();
System.out.println(polledFirstEntry);//one=-1
System.out.println(myMap);//{zero=0,two=2}

SequencedMapreversedMap=myMap.reversed();
System.out.println(reversedMap);//{two=2,zero=0}

booleanisEqual=myMap.equals(reversedMap);
System.out.println(isEqual);//true
System.out.println(myMap.hashCode());//692224
System.out.println(reversedMap.hashCode());//692224
System.out.println(myMap.hashCode()==reversedMap.hashCode());//true

3 字符串模板

這是預覽功能,默認禁用,我們需要使用

--enable-preview啟用字符串模板。

首先,在深入探討字符串模板之前,我將探討一些用于組合字符串的技術。

+(加號)運算符: 最大的缺點是每次使用 + 運算符時都會創建一個新字符串。

StringBuffer 和 StringBuilder: StringBuffer 是線程安全的,而 StringBuilder 是在 Java 5 中添加的,性能更高,但不是線程安全的替代方案。

它們的主要缺點是冗長,尤其是對于更簡單的字符串:

vargreeting=newStringBuilder()
.append("Hello,welcome")
.append(name)
.toString();

String::format 和 String::formatter: 它們允許可重用模板,但它們要求我們指定格式并以正確的順序提供變量。

varformat="Goodmorning%s,It'sabeautifulday!";
vartext=String.format(format,name);
//Java15+
vartext=format.formatter(name);

盡管我們節省了字符串分配的數量,但現在 JVM 必須解析/驗證模板字符串。

java.text.MessageFormat: 與String格式相同,但更詳細

varformat=newMessageFormat("Goodmorning{0},It'sabeautifulday!");
vargreeting=format.format(name);

現在我們有字符串模板來拯救

它簡單、簡潔,處理字符串的新方法稱為模板表達式。它們可以執行插值,還為我們提供了組合字符串的靈活性,并將結構化文本轉換為任何對象,而不僅僅是字符串。

模板表達式由三個組成部分組成:

模板處理器:Java 提供了兩種用于執行字符串插值的模板處理器:STR 和 FMT

包含包裝表達式的模板,如 {name}

點 (.) 字符

以下是一些關于如何將字符串模板與模板處理器一起使用的示例:

packagecom.mina.stringtemplates;

importstaticjava.util.FormatProcessor.FMT;

importjava.time.LocalDate;
importjava.time.format.DateTimeFormatter;

publicclassStringTemplateExamples{

publicstaticStringgreeting(StringfirstName,StringlastName){
returnSTR."Hello!Goodmorning{firstName}{lastName}";
}

publicstaticStringmultiplyWithArithmeticExpressions(inta,intb){
returnSTR."{a}times{b}={a*b}";
}

publicstaticStringmultiplyWithJavaExpression(inta,intb){
returnSTR."{a}times{b}={Math.multiplyExact(a,b)}";
}

//multiplicationwithfloatingpointnumbersroundedtotwodecimalplacesusingtheFMTtemplateprocessor
publicstaticStringmultiplyFloatingNumbers(doublea,doubleb){
returnFMT."%.2f{a}times%.2f{b}=%.2f{a*b}";
}

publicstaticStringgetErrorResponse(inthttpStatus,StringerrorMessage){
returnSTR."""
{
"httpStatus":{httpStatus},
"errorMessage":"{errorMessage}"
}""";
}

publicstaticStringgetCurrentDate(){
returnSTR."Today'sdate:{
LocalDate.now().format(
DateTimeFormatter.ofPattern("yyyy-MM-dd")
)}";
}
}

4 記錄模式

記錄模式匹配是一種在單個步驟中匹配記錄類型并訪問其組件的方法。

我們用它來測試一個值是否是記錄類類型的實例,如果是,則對其組件值執行模式匹配。

下面的示例測試是否是具有記錄模式transaction的記錄實例TransactionTransaction(String type, double amount)

packagecom.mina.recordpattern;

publicclassRecordPatternExample{

//I'musing"_"forreadabilityhere,thiswon'tcompile
publicstaticStringgetTransactionType(Transactiontransaction){
returnswitch(transaction){
casenull->thrownewIllegalArgumentException("Transactioncannotbenull.");
caseTransaction(Stringtype,doubleamount)whentype.equals("Deposit")&&amount>0->"Deposit";
caseTransaction(Stringtype,_)whentype.equals("Withdrawal")->"Withdrawal";
default->"Unknowntransactiontype";
};
}

recordTransaction(Stringtype,doubleamount){

}
}

如果事務為空,會發生什么?你是對的——拋出了一個空指針異常。這也是Java 21中的情況,但是現在我們可以通過寫case null->來顯式地使用null case,這樣可以避免NullPointerException。

保護模式:也可以保護特定情況。例如,我們使用when關鍵字來檢查相等性。

5 switch 模式匹配

switch模式匹配在 Java 17 中作為預覽功能引入,并在 Java 21 中永久保留。

語句switch將控制轉移到多個語句或表達式之一,具體取決于其選擇器表達式的值(可以是任何類型),并且case標簽可以具有模式。

它檢查其選擇器表達式是否與模式匹配,與測試其選擇器表達式是否完全等于常量相比,這更具可讀性和靈活性。

packagecom.mina.switchpatternmatching;

importcom.mina.switchpatternmatching.SwitchPatternMatchingExample.Transaction.Deposit;
importcom.mina.switchpatternmatching.SwitchPatternMatchingExample.Transaction.Withdrawal;

publicclassSwitchPatternMatchingExample{

publicstaticStringgetTransactionType(Transactiontransaction){
returnswitch(transaction){
casenull:
thrownewIllegalArgumentException("Transactioncan'tbenull.");
caseDepositdepositwhendeposit.getAmount()>0://Guardedpatternwithwhenclause
yield"Deposit";
caseWithdrawalwithdrawal:
yield"Withdrawal";
default:
yield"Unknowntransactiontype";
};
}

sealedclassTransactionpermitsDeposit,Withdrawal{

privatedoubleamount;

publicTransaction(doubleamount){
this.amount=amount;
}

publicdoublegetAmount(){
returnamount;
}


finalclassWithdrawalextendsTransaction{

publicWithdrawal(doubleamount){
super(amount);
}
}

finalclassDepositextendsTransaction{

publicDeposit(doubleamount){
super(amount);
}
}
}
}

希望這篇文章可以幫助您更好地了解 Java 21 的新功能!


審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2960

    瀏覽量

    104562
  • 字符串
    +關注

    關注

    1

    文章

    577

    瀏覽量

    20488
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19653

原文標題:Java 21 新特性的實踐,確實很絲滑!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    了解Java中的構造器

    C ++ 引入了構造器(constructor,也叫構造函數)的概念,它是在創建對象時被自動調用的特殊方法。 Java 也采用了構造器,并且還提供了個垃圾收集器(garbage collector),當不再使用內存資源的時候,垃圾收集器會自動將其釋放。
    發表于 11-22 09:32 ?482次閱讀

    PowerDesigner 10.0的新功能

    PowerDesigner 10.0的新功能Available February 9, 2004Business Process Simulation using
    發表于 06-27 17:01

    allegro 16.6 部分新功能 介紹

    本帖最后由 eric0921 于 2012-8-27 21:24 編輯 allegro 16.6部分新功能介紹
    發表于 08-27 21:23

    Altium Designer 20 新功能官方直播

    ,Altium大中華區技術經理將為大家帶來Altium Designer 20的官方直播!現場、講解演示新版本的全新功能及增強功能,還等什么,快復制鏈接報名吧!報名鏈接:https
    發表于 12-27 15:06

    AWTK Designer 1.0.2有哪些新功能

    為不斷提升用戶體驗,本次Designer 1.0.2增加了自定義控件和插件管理以及其他許多新功能,并對現有功能進行了優化,讓我們起來看看這些很酷的新功能吧!
    發表于 03-04 08:27

    21天學通JAVA2_袁國忠譯

    21天學通Java2》包括4周的課程。第周介紹Java語言的基本知識,包括數據類型、變量、表達式、對象、數組、條件語句、循環、類、接口、包異常和線程等;第二周介紹
    發表于 12-06 10:38 ?0次下載
    <b class='flag-5'>21</b>天學通<b class='flag-5'>JAVA</b>2_袁國忠譯

    Java學習路線教程之Java新手必須學習那21個技術點詳細資料說明

    Java新手必學的21個技術點 以下為大家盤點作為Java新手必學的21個技術點,希望能夠對想要學習編程,學習JAVA的人有些幫助! JN
    發表于 12-19 15:23 ?19次下載

    微軟開始測試 21H1 的功能體驗包功能 無需大版本更新即可體驗

    Win10 21H1 是個小更新,它將在 2021 年上半年(5 月至 6 月)到來。21H1 幾乎完全沒有添加任何新功能,似乎僅在安全性和 “質量”方面有所改進,包括 Window
    的頭像 發表于 02-24 14:29 ?1951次閱讀

    蘋果ios15新功能

     昨日,蘋果WWDC21發表會如期舉行,WWDC21中最讓人值得關注的大概就是IOS15系統的發布。那么蘋果此次發布的ios15系統有哪些新功能呢?下面我們起來看看!
    的頭像 發表于 06-09 15:01 ?3267次閱讀

    Java21版本的使用

    ? 如果你是位苦逼的 Java 程序員,那么當你看到這張圖的時候也許震驚的會跳起來! 但是我最大的感受是: 臥槽,怎么就Java 21了?!我還在用
    的頭像 發表于 06-19 09:42 ?1886次閱讀
    <b class='flag-5'>Java21</b>版本的使用

    了解 PCB 的有效導熱系數

    了解 PCB 的有效導熱系數
    的頭像 發表于 11-24 15:48 ?1877次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b> PCB 的有效導熱系數

    了解剛柔結合制造過程

    了解剛柔結合制造過程
    的頭像 發表于 12-04 16:22 ?729次閱讀

    帶你了解 DAC

    了解 DAC
    的頭像 發表于 12-07 15:10 ?8641次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>帶你<b class='flag-5'>了解</b> DAC

    言APP上線數字分身功能

    言APP近日上線了項令人興奮的新功能——數字分身。這功能允許用戶輕松創建自己的個性化虛
    的頭像 發表于 02-04 10:32 ?1136次閱讀

    淺談Xpedition 2409版本的新功能

    在《創新不止|Xpedition 2409版本新功能揭秘(上)》中,我們了解了Xpedition 2409版本的部分改進部分。今天,我們繼續看Xpedition 2409新版本給我
    的頭像 發表于 10-31 15:33 ?397次閱讀