女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

一文了解Java 21的新功能

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

來源:medium.com

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

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

虛擬線程

序列集合

記錄模式

字符串模板(預(yù)覽)

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

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

作用域值(預(yù)覽)

結(jié)構(gòu)化并發(fā)(預(yù)覽)

1 虛擬線程

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

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

載體線程池是ForkJoinPool

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

虛擬線程的一些優(yōu)點:

提高應(yīng)用程序吞吐量

提高應(yīng)用程序可用性

減少內(nèi)存消耗

創(chuàng)建虛擬線程

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

Thread.ofVirtual().start(Runnable);

Thread.ofVirtual().unstarted(Runnable);

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

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

創(chuàng)建使用虛擬線程的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 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址: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()之外的所有方法都是默認方法并提供默認實現(xiàn)。

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

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 非常有用,特別是當(dāng)您必須執(zhí)行某些操作(例如檢索或刪除第一個或最后一個索引處的元素)時。它還提供了一種反轉(zhuǎn)元素的方法。

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

interfaceSequencedSetextendsSet,SequencedCollection{
SequencedSetreversed();
}

LinkedHashSet 是 Set 的一個實現(xiàn),它實現(xiàn)了 SequencedSet 接口。

因此,您可以使用 LinkedHashSet 來創(chuàng)建 SequencedSet。

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

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

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 實現(xiàn),例如 LinkedHashMap 或?qū)崿F(xiàn) 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。

此外,調(diào)用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 字符串模板

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

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

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

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

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);

盡管我們節(jié)省了字符串分配的數(shù)量,但現(xiàn)在 JVM 必須解析/驗證模板字符串。

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

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

現(xiàn)在我們有字符串模板來拯救

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

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

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

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

點 (.) 字符

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

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 記錄模式

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

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

下面的示例測試是否是具有記錄模式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){

}
}

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

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

5 switch 模式匹配

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

語句switch將控制轉(zhuǎn)移到多個語句或表達式之一,具體取決于其選擇器表達式的值(可以是任何類型),并且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 的新功能!


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

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106831
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    589

    瀏覽量

    21095
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70239
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20070

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

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

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    了解Java中的構(gòu)造器

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

    PowerDesigner 10.0的新功能

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

    allegro 16.6 部分新功能 介紹

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

    Altium Designer 20 新功能官方直播

    ,Altium大中華區(qū)技術(shù)經(jīng)理將為大家?guī)鞟ltium Designer 20的官方直播!現(xiàn)場、講解演示新版本的全新功能及增強功能,還等什么,快復(fù)制鏈接報名吧!報名鏈接:https
    發(fā)表于 12-27 15:06

    21天學(xué)通JAVA2_袁國忠譯

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

    Java學(xué)習(xí)路線教程之Java新手必須學(xué)習(xí)那21個技術(shù)點詳細資料說明

    Java新手必學(xué)的21個技術(shù)點 以下為大家盤點作為Java新手必學(xué)的21個技術(shù)點,希望能夠?qū)ο胍獙W(xué)習(xí)編程,學(xué)習(xí)JAVA的人有些幫助! JN
    發(fā)表于 12-19 15:23 ?19次下載

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

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

    蘋果ios15新功能

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

    Java21版本的使用

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

    了解 PCB 的有效導(dǎo)熱系數(shù)

    了解 PCB 的有效導(dǎo)熱系數(shù)
    的頭像 發(fā)表于 11-24 15:48 ?2716次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>了解</b> PCB 的有效導(dǎo)熱系數(shù)

    了解剛?cè)峤Y(jié)合制造過程

    了解剛?cè)峤Y(jié)合制造過程
    的頭像 發(fā)表于 12-04 16:22 ?1131次閱讀

    帶你了解 DAC

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

    言APP上線數(shù)字分身功能

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

    淺談Xpedition 2409版本的新功能

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

    Java 23功能介紹

    功能。 跟上 Java 新版本的發(fā)布節(jié)奏可能很難,這意味著要解決連串的問題——更改是什么、為什么要更改以及如何使用全新和更新的功能。 在這篇博文中,我將介紹
    的頭像 發(fā)表于 12-04 10:02 ?825次閱讀
    <b class='flag-5'>Java</b> 23<b class='flag-5'>功能</b>介紹