Java 21 新特性:Record Patterns

程式猿DD發表於2023-09-21

Record Patterns 第一次釋出預覽是在JDK 19、隨後又在JDK 20中進行了完善。現在,Java 21開始正式推出該特性最佳化。下面我們透過一個例子來理解這個新特性。

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

上述程式碼中定義了一個名為Point的record類(Java 16中的新特性),如果我們想要獲取、操作或者列印Point中的x和y的話。就不得不先完成型別判斷和型別轉換。所以,這裡為了實現x+y總共需要4行程式碼。而在Java 21之後,只需要2行程式碼就能完成:

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

可以看到,型別判斷、型別轉換、record值的結構都一氣呵成了,所以程式碼量得到了簡化。

巢狀record的解構

假設有下面一組巢狀的record結構(WindowFrame中包含了PointSize):

record Size(int width, int height) { }
record Point(int x, int y) { }
record WindowFrame(Point origin, Size size) { }

這個時候,如果想要訪問WindowFrameSize的height,根據之前案例的理解,我們可以這樣寫:

if (obj instanceof WindowFrame wf) {
  if (wf.size() != null) {
    System.out.println("Height: " + wf.size().height());
  }
}

好像也沒有很簡單,但實際上還有更簡單的寫法,因為record的解構是可以巢狀的,直接這樣一步完成即可:

if (obj instanceof WindowFrame(Point origin, Size(int width, int height))) {
    System.out.println("Height: " + height);
}

是不是一下感受到這個新特性的強大了?如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!另外,不要走開,關注我!持續更新Java新特性專欄

歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源

相關文章