国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JDK21新特性Record Patterns記錄模式詳解

這篇具有很好參考價(jià)值的文章主要介紹了JDK21新特性Record Patterns記錄模式詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1 摘要

通過使用記錄模式來增強(qiáng)Java編程語言,以解構(gòu)記錄值。記錄模式和類型模式可嵌套使用,從而實(shí)現(xiàn)強(qiáng)大、聲明式和可組合的數(shù)據(jù)導(dǎo)航和處理形式。

2 發(fā)展史

由 JEP 405 提出的預(yù)覽功能,并在JDK 19發(fā)布,然后由 JEP 432 再次預(yù)覽,并在JDK 20發(fā)布。該功能與用于switch的模式匹配(JEP 441)共同演進(jìn),并且二者有相當(dāng)大的交互作用。本JEP提議在持續(xù)的經(jīng)驗(yàn)和反饋基礎(chǔ)上對(duì)該功能完善。

除了一些次要的編輯更改,自第二個(gè)預(yù)覽版以來的主要變化是刪除了對(duì)增強(qiáng)for語句頭部出現(xiàn)記錄模式的支持。這個(gè)功能可能會(huì)在未來的JEP中重提。

3 目標(biāo)

  • 擴(kuò)展模式匹配以解構(gòu)記錄類的實(shí)例,實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)查詢
  • 添加嵌套模式,實(shí)現(xiàn)更可組合的數(shù)據(jù)查詢

4 動(dòng)機(jī)

Java 16中, JEP 394 擴(kuò)展了instanceof運(yùn)算符,使其可接受類型模式并執(zhí)行模式匹配。這個(gè)簡(jiǎn)單的擴(kuò)展使得熟悉的instanceof和強(qiáng)制轉(zhuǎn)換慣用法變得更簡(jiǎn)潔、更不易出錯(cuò):

// <Java 16
if (obj instanceof String) {
    String s = (String)obj;
    ... 使用s ...
}
// ≥Java 16
if (obj instanceof String s) {
    ... 使用s ...
}

新代碼中,若obj在運(yùn)行時(shí)是String的實(shí)例,則obj與類型模式String s匹配。若模式匹配成功,則instanceof true,且模式變量s被初始化為obj強(qiáng)制轉(zhuǎn)換為String的值,然后可以在包含的代碼塊中使用。

類型模式一次性消除了許多類型轉(zhuǎn)換的出現(xiàn)。然而,它們只是朝著更聲明式、以數(shù)據(jù)為焦點(diǎn)的編程風(fēng)格邁出的第一步。隨Java支持新的、更具表現(xiàn)力的數(shù)據(jù)建模,模式匹配可通過讓開發(fā)表達(dá)模型的語義意圖來簡(jiǎn)化對(duì)這些數(shù)據(jù)的使用。

5 Pattern matching和records

記錄 (JEP 395) 是數(shù)據(jù)的透明載體。接收記錄類實(shí)例的代碼通常會(huì)使用內(nèi)置的組件訪問器方法提取數(shù)據(jù),即組件。

5.1 Point的實(shí)例

如用類型模式測(cè)試一個(gè)值是否是記錄類Point的實(shí)例,并在匹配成功時(shí)從該值中提取x和y組件。

Java8

class Point {
    private int x;
    private int y;
    
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
}

static void printSum(Object obj) {
    if (obj instanceof Point) {
        Point p = (Point) obj;
        int x = p.getX();
        int y = p.getY();
        System.out.println(x + y);
    }
}

≥Java 16

record Point(int x, int y) {}

static void printSum(Object obj) {
    if (obj instanceof Point p) {
        int x = p.x();
        int y = p.y();
        System.out.println(x+y);
    }
}

僅使用模式變量p調(diào)用訪問方法x()、y(),這些方法返回組件x和y的值。

在每個(gè)記錄類中,其訪問方法和組件之間存在一對(duì)一對(duì)應(yīng)關(guān)系。

如果模式不僅可測(cè)試一個(gè)值是否是Point的實(shí)例,還可直接從該值中提取x和y組件,從而代表我們調(diào)用訪問器方法的意圖將更好。換句話說:

// Java 21及以后
static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

Point(int x, int y) 是一個(gè)record pattern。它將用于提取組件的局部變量的聲明直接提升到模式本身,并在值與模式匹配時(shí)通過調(diào)用訪問方法對(duì)這些變量初始化。實(shí)際上,record pattern將記錄的實(shí)例解構(gòu)為其組件。

6 嵌套record pattern

模式匹配的真正威力在于優(yōu)雅擴(kuò)展到匹配更復(fù)雜的對(duì)象圖。

考慮以下聲明:

// Java 16及以后
record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

已知可使用記錄模式提取對(duì)象的組件。如想從左上角點(diǎn)提取顏色:

// Java 21及以后
static void printUpperLeftColoredPoint(Rectangle r) {
    if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
         System.out.println(ul.c());
    }
}

但ColoredPoint值ul本身是個(gè)記錄值,希望進(jìn)一步分解。因此,記錄模式支持嵌套,允許對(duì)記錄組件進(jìn)一步匹配、分解??稍谟涗浤J街星短琢硪粋€(gè)模式,同時(shí)對(duì)外部和內(nèi)部記錄分解:

// Java 21及以后
static void printColorOfUpperLeftPoint(Rectangle r) {
    if (r instanceof Rectangle(ColoredPoint(Point p, Color c),
                               ColoredPoint lr)) {
        System.out.println(c);
    }
}

嵌套模式允許以與組裝對(duì)象的代碼一樣清晰簡(jiǎn)潔方式拆解聚合。如創(chuàng)建一個(gè)矩形,通常會(huì)將構(gòu)造函數(shù)嵌套在一個(gè)表達(dá)式中:

// Java 16及以后
Rectangle r = new Rectangle(new ColoredPoint(new Point(x1, y1), c1), 
                            new ColoredPoint(new Point(x2, y2), c2));

使用嵌套模式,我們可以使用與嵌套構(gòu)造函數(shù)結(jié)構(gòu)相似的代碼來解構(gòu)這樣的矩形:

// Java 21及以后
static void printXCoordOfUpperLeftPointWithPatterns(Rectangle r) {
    if (r instanceof Rectangle(ColoredPoint(Point(var x, var y), var c),
                               var lr)) {
        System.out.println("Upper-left corner: " + x);
    }
}

嵌套模式可能無法匹配:

// Java 21及以后
record Pair(Object x, Object y) {}
Pair p = new Pair(42, 42);
if (p instanceof Pair(String s, String t)) {
    System.out.println(s + ", " + t);
} else {
    System.out.println("Not a pair of strings");
}

這里的記錄模式Pair(String s, String t)包含了兩個(gè)嵌套的類型模式,即String s和String t。如果一個(gè)值與模式Pair(String s, String t)匹配,那么它是一個(gè)Pair,并且遞歸地,它的組件值與類型模式String s和String t匹配。在我們上面的示例代碼中,由于記錄的兩個(gè)組件值都不是字符串,因此這些遞歸的模式匹配失敗,因此執(zhí)行else塊。

總之,嵌套模式消除了導(dǎo)航對(duì)象的意外復(fù)雜性,使我們能專注這些對(duì)象所表示的數(shù)據(jù)。它們還賦予我們集中處理錯(cuò)誤的能力,因?yàn)槿绻粋€(gè)值無法與嵌套模式P(Q)匹配,那子模式P和Q中的任何一個(gè)或兩個(gè)都無法匹配。我們不需要檢查和處理每個(gè)單獨(dú)的子模式匹配失敗——要么整個(gè)模式匹配,要么不匹配。

7 描述

使用可嵌套的記錄模式。

模式語法變?yōu)椋?/p>

Pattern:
  TypePattern
  RecordPattern

TypePattern:
  LocalVariableDeclaration

RecordPattern:
  ReferenceType ( [ PatternList ] )

PatternList: 
  Pattern { , Pattern }

8 記錄模式

由記錄類類型和(可能為空的)模式列表組成,該列表用于與相應(yīng)的記錄組件值進(jìn)行匹配。

如聲明

record Point(int i, int j) {}

如果值v與記錄模式Point(int i, int j)匹配,則它是記錄類型Point的實(shí)例;如這樣,模式變量i將被初始化為在值v上調(diào)用與i對(duì)應(yīng)的訪問器方法的結(jié)果,模式變量j將被初始化為在值v上調(diào)用與j對(duì)應(yīng)的訪問器方法的結(jié)果。(模式變量的名稱不需要與記錄組件的名稱相同;也就是說,記錄模式Point(int x, int y)的行為相同,只是模式變量x和y被初始化。)

null值不與任何記錄模式匹配。

記錄模式可用var來匹配記錄組件,而無需聲明組件的類型。在這種情況下,編譯器會(huì)推斷由var模式引入的模式變量的類型。如模式Point(var a, var b)是模式Point(int a, int b)的簡(jiǎn)寫。

記錄模式聲明的模式變量集合包括模式列表中聲明的所有模式變量。

如果一個(gè)表達(dá)式可以在不需要未經(jīng)檢查的轉(zhuǎn)換的情況下將其轉(zhuǎn)換為模式中的記錄類型,則該表達(dá)式與記錄模式兼容。

如果記錄模式命名了一個(gè)泛型記錄類,但沒有給出類型參數(shù)(即,記錄模式使用原始類型),則始終會(huì)推斷類型參數(shù)。例如:

// Java 21及以后
record MyPair<S,T>(S fst, T snd){};
static void recordInference(MyPair<String, Integer> pair){
    switch (pair) {
        case MyPair(var f, var s) -> 
            ... // 推斷的記錄模式 MyPair<String,Integer>(var f, var s)
        ...
    }
}

記錄模式的類型參數(shù)推斷在支持記錄模式的所有結(jié)構(gòu)中都受到支持,即instanceof表達(dá)式和switch語句和表達(dá)式。

推斷適用于嵌套記錄模式;例如:

// Java 21及以后
record Box<T>(T t) {}
static void test1(Box<Box<String>> bbs) {
    if (bbs instanceof Box<Box<String>>(Box(var s))) {
        System.out.println("String " + s);
    }
}

這里,嵌套模式Box(var s)的類型參數(shù)被推斷為String,因此模式本身被推斷為Box(var s)。

甚至可省略外部記錄模式中的類型參數(shù),得到簡(jiǎn)潔代碼:

// Java 21及以后
static void test2(Box<Box<String>> bbs) {
    if (bbs instanceof Box(Box(var s))) {
        System.out.println("String " + s);
    }
}

這里編譯器會(huì)推斷整個(gè)instanceof模式為Box<Box<String>>(Box<String>(var s))。

為保持兼容性,類型模式不支持隱式推斷類型參數(shù);如類型模式List l始終被視為原始類型模式。

9 記錄模式和完整的switch

JEP 441增強(qiáng)了switch表達(dá)式和switch語句,以支持模式標(biāo)簽。無論是switch表達(dá)式還是模式switch語句,都必須是完整的:switch塊必須有處理選擇器表達(dá)式的所有可能值的子句。對(duì)于模式標(biāo)簽,這是通過分析模式的類型來確定的;例如,case標(biāo)簽case Bar b匹配類型為Bar及其所有可能的子類型的值。

對(duì)于涉及記錄模式的模式標(biāo)簽,分析更加復(fù)雜,因?yàn)槲覀儽仨毧紤]組件模式的類型,并對(duì)密封層次結(jié)構(gòu)進(jìn)行調(diào)整。例如,考慮以下聲明:

class A {}
class B extends A {}
sealed interface I permits C, D {}
final class C implements I {}
final class D implements I {}
record Pair<T>(T x, T y) {}
Pair<A> p1;
Pair<I> p2;

以下switch不是完整的,因?yàn)闆]有匹配包含兩個(gè)類型為A的值的對(duì):

// Java 21及以后
switch (p1) {                 // 錯(cuò)誤!
    case Pair<A>(A a, B b) -> ...
    case Pair<A>(B b, A a) -> ...
}

這兩個(gè)switch是完整的,因?yàn)榻涌贗是密封的,因此類型C和D涵蓋了所有可能的實(shí)例:

// Java 21及以后
switch (p2) {
    case Pair<I>(I i, C c) -> ...
    case Pair<I>(I i, D d) -> ...
}

switch (p2) {
    case Pair<I>(C c, I i) -> ...
    case Pair<I>(D d, C c) -> ...
    case Pair<I>(D d1, D d2) -> ...
}

相比之下,這個(gè)switch不是完整的,因?yàn)闆]有匹配包含兩個(gè)類型為D的值的對(duì):

// Java 21及以后
switch (p2) {                        // 錯(cuò)誤!
    case Pair<I>(C fst, D snd) -> ...
    case Pair<I>(D fst, C snd) -> ...
    case Pair<I>(I fst, C snd) -> ...
}

10 未來

記錄模式的描述中提到了許多可以擴(kuò)展這里描述的記錄模式的方向:

  • 可變參數(shù)模式,用于可變數(shù)量的記錄
  • 匿名模式,可以出現(xiàn)在記錄模式的模式列表中,匹配任何值,但不聲明模式變量
  • 適用于任意類的值而不僅僅是記錄類的模式。

我們可以在未來的JEP中考慮其中的一些方向。

11 依賴關(guān)系

本JEP建立在Pattern Matching for instanceof(JEP 394)的基礎(chǔ)上,該功能已在JDK 16中發(fā)布。它與Pattern Matching for switch(JEP 441)共同演進(jìn)。

本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-712113.html

到了這里,關(guān)于JDK21新特性Record Patterns記錄模式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JDK21發(fā)布了!面試官:來,談下jdk21的新特性!

    JDK21發(fā)布了!面試官:來,談下jdk21的新特性!

    JDK21 計(jì)劃23年9月19日正式發(fā)布,盡管一直以來都是“版隨意出,換 8 算我輸”,但這么多年這么多版本的折騰,若是之前的 LTS 版本JDK17你還覺得不錯(cuò),那 JDK21還是有必要關(guān)注一下,因?yàn)闀?huì)有一批重要更新發(fā)布到生產(chǎn)環(huán)境中,特別是被眾人期待已久的虛擬線程,縱然說這東西我

    2024年02月07日
    瀏覽(21)
  • JDK21新特性

    JDK21新特性

    JDK8新特性 JDK9新特性 JDK10新特性 JDK11新特性 JDK12新特性 JDK13新特性 JDK14新特性 JDK15新特性 JDK16新特性 JDK17新特性 JDK18新特性 JDK19新特性 JDK20新特性 JDK21新特性 JDK 21 于 2023 年 9 月 19 日 發(fā)布,這是一個(gè)非常重要的版本,里程碑式。 JDK21 是 LTS(長(zhǎng)期支持版),至此為止,目前有

    2024年02月22日
    瀏覽(25)
  • 【Java基礎(chǔ)系列】JDK21新特性

    【Java基礎(chǔ)系列】JDK21新特性

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月04日
    瀏覽(23)
  • JDK8,JDK11,JDK17,JDK21及中間版本主要更新特性

    JDK8,JDK11,JDK17,JDK21及中間版本主要更新特性

    官方地址: https://www.oracle.com/java/technologies/java-se-support-roadmap.html 從上圖可以很清晰得可以看出,JDK7,JDK8,JDK11,JDK17,JDK21是長(zhǎng)期維護(hù)的版本。從目前來看,JDK8到2023年已經(jīng)有將近10年的歷史了,大多數(shù)依據(jù)JDK8的相關(guān)技術(shù)內(nèi)容已經(jīng)很成熟了,但是大家也看到,JDK在不斷地迭代,JD

    2024年02月21日
    瀏覽(25)
  • 【收藏】35個(gè)JDK 21新特性(含示例代碼)

    2024年威哥攜三位兄弟,Mask、強(qiáng)哥、索尓一起探索Java?JDK21 LTS版,JDK 21 帶來了一些令人興奮的新特性和改進(jìn),總結(jié)了一些自己的筆記,分享給大家,本文將介紹其中一些重要的內(nèi)容,并提供相應(yīng)的示例代碼以幫助讀者更好地理解,閱讀全文需要花費(fèi)你10分鐘,收藏起來肯定有

    2024年04月15日
    瀏覽(20)
  • Java/JDK 21正式發(fā)布!15個(gè)特性一覽

    JDK 21已經(jīng)于2023年9月19日正式發(fā)布。本文總結(jié)了JDK 21發(fā)布的新特性。 根據(jù)發(fā)布的規(guī)劃,這次發(fā)布的 JDK 21 將是一個(gè)長(zhǎng)期支持版(LTS 版)。LTS 版每 2 年發(fā)布一個(gè),上一次長(zhǎng)期支持版是 21 年 9 月發(fā)布的 JDK 17。 本版本是Java SE平臺(tái)21版的參考實(shí)現(xiàn),由Java社區(qū)流程中的JSR 396指定。 主

    2024年02月08日
    瀏覽(23)
  • JDK8、JDK11、JDK17和JDK21這幾個(gè)版本更新的主要特性

    JDK8、JDK11、JDK17和JDK21這幾個(gè)版本更新的主要特性

    JDK8 是 Java 的一個(gè)重大更新版本,引入了一系列新特性和改進(jìn),主要包括: Lambda 表達(dá)式: Lambda 表達(dá)式允許我們以簡(jiǎn)潔、函數(shù)式的方式編寫代碼,使代碼更易于理解和維護(hù)。- Stream API : Stream API 提供了一套聲明式處理數(shù)據(jù)的方式,使得對(duì)集合和數(shù)組的操作更加直觀和高效。

    2024年04月29日
    瀏覽(23)
  • Java_JDK8到JDK21各版本發(fā)行時(shí)間及重要特性

    2022年Spring6和SpringBoot3相繼推出,在此之前,Java社區(qū)一直是\\\"新版任你發(fā),我用Java 8\\\",不管新版本怎么出,很少有人愿意升級(jí)。 這一次,Spring 直接來了個(gè)大招,SpringBoot3和Spring6的最低依賴就是JDK17!跨過 JDK 8-16,直接升級(jí)到 JDK 17。那么為什么是 JDK 17呢? 為什么是JDK17這么多新

    2024年01月19日
    瀏覽(37)
  • 【Java】JDK 21中的虛擬線程以及其他新特性

    【Java】JDK 21中的虛擬線程以及其他新特性

    ? 目錄 一、字符串模板(String Templates) 二、序列化集合(Sequenced Collections) 三、分代ZGC(Generational ZGC) 四、記錄模式(Record Patterns) 五、Fibers(纖程) 結(jié)論 JDK 21是Java開發(fā)工具包的最新版本,它引入了許多令人振奮的新特性,旨在提高開發(fā)人員的生產(chǎn)力和代碼質(zhì)量。在本

    2024年02月08日
    瀏覽(25)
  • JDK 21 發(fā)布,新特性概覽及字符串模板詳細(xì)介紹

    Java 21 已于 2023 年 9 月 19 日發(fā)布,是 Oracle 標(biāo)準(zhǔn) Java 實(shí)現(xiàn)的下一個(gè)長(zhǎng)期支持(LTS)版本。Java 21 具有以下 15 項(xiàng)新特性。 430: String Templates (Preview) 字符串模板,可以像其他語言那樣子方便的做字符串拼接,是+號(hào),StringBuilder,MessageFormat之外更方便的字符串拼接方法。 431: Sequenc

    2024年02月02日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包