Có gì hot trong phiên bản JDK21 vừa được ra lò

Thế là phiên bản LTS mới nhất vừa được release vào tối ngày 19/09/2023. Cùng tìm hiểu xem có những tính năng gì thú vị dưới góc nhìn của 1 Scala developer.

Danh sách một số tính năng chính:

  1. Virtual Threads
  2. Sequenced Collections
  3. Record Patterns
  4. Pattern Matching
  5. New String Methods

I. Virtual Threads

Tính năng này đến từ 1 dự án có tên Project Loom được giới thiệu lần đầu tiên trong JDK19. Vậy Virtual Threads là gì và vì đâu tính năng này ra đời ?

Trở lại các phiên bản trước đây: Threads trong Java tương đương với Threads của Os theo tỉ lệ 1:1. Tức là giả sử bạn viết 1 đoạn Java code tạo ra 50 threads thì 50 threads này là các threads trực tiếp từ Os.  Khi mở rộng ứng dụng, xu hướng là chúng ta sẽ cần càng nhiều threads hơn, dẫn đến memory tăng theo. Việc này tạo ra áp lực nên CPU do nhu cầu “switch context”. Thêm nữa, các developer ít kinh nghiệm thường mắc lỗi trong việc quản lý threads dẫn đến việc sử dụng chúng không hiệu quả.

Với Vitural Threads câu chuyện nay đã khác, threads Java & threads Os sẽ theo tỉ lệ: n:1. Tức là ta có thể chạy rất nhiều đoạn code bất động bộ với số lượng threads Os ít hơn, đôi khi chỉ cần 1. Thời gian khởi tạo & tài nguyên cần thiết của Vitural Thread ít hơn so với Threads Os. Vitural Threads sẽ được quản lý bởi JDK. Nhìn chung, tính năng này rất hữu ích và được cộng đồng đón nhận tích cực

Ở góc nhìn của 1 Scala developer, tính năng này không có gì mới mẻ bởi từ lâu trong Scala-Akka đã có 1 tính năng tương tự là Actor. Về ý tưởng Virtual Thread hoạt động rất giống với Actor tuy chưa thể bằng về tính năng & độ hữu ích. Chắc chắn trong tương lai Oracle sẽ có nhiều cải tiến hơn với tính năng này.

II. Sequenced Collections

Trước JDK21, muốn truy cập phần tử đầu & cuối cùng của list:

var head = list.get(0);
var last = list.get(list.size() - 1);

Với JDK21, chúng ta có thể viết đơn giản hơn:

var head = list.getFirst();
var last = list.getLast();

Ngoài ra, có thêm 1 số method khác như:

  • void addFirst(E): Chèn phần tử vào vị trí đầu tiên của danh sách
  • void addLast(E): Chèn phần tử vào vị trí cuối cùng của danh sách
  • E removeFirst(): Lấy và xóa phần tử đầu tiên của danh sách
  • E removeLast(): Lấy và xóa phần tử cuối cùng của danh sách
  • SequencedCollection reversed(): Trả về danh sách đảo ngược

Tương tự, chúng ta cũng có các method giống như trên áp dụng cho Set & Map.

Thêm các method này giúp cho việc coding trở lên dễ dàng và rõ ràng hơn

Ở góc nhìn của 1 Scala developer, tính năng này trong Scala đã có từ lâu và được sử dụng rất thường xuyên

III. Record Patterns

Record Patterns được giới thiệu lần đầu tiên trong JDK19

public record Position(int x, int y) {}

Nhờ có tính năng này, tôi đã không còn cần sử dụng Loombok. Ở phiên bản JDK21, thêm tính năng “extraction” với Record, sử dụng kết hợp với Pattern Matching rất tiện lợi.

Với If..Else, trước JDK21:

public void print(Object o) {
    if (o instanceof Position p) {
        System.out.printf("o is a position: %d/%d%n", p.x(), p.y());
    } else {
        System.out.printf("o is something else: %s%n", o);
    }
}

Với JDK21:

public void print(Object o) {
    if (o instanceof Position(int x, int y)) {
        System.out.printf("o is a position: %d/%d%n", x, y);
    } else {
        System.out.printf("o is something else: %s%n", o);
    }
}

Với switch, trước JDK21:

public void print(Object o) {
  switch (o) {
    case Position p -> System.out.printf("o is a position: %d/%d%n", p.x(), p.y());
    default -> System.out.printf("o is something else: %s%n", o);
  }
}

Với JDK21:

public void print(Object o) {
    switch (o) {
        case Position(int x, int y) -> System.out.printf("o is a position: %d/%d%n", x, y);
        default                     -> System.out.printf("o is something else: %s%n", o);
    }
}

Ở góc nhìn của 1 Scala developer, tính năng này tương đồng với “case class” của Scala tuy nhiên vẫn chưa thể bằng được. Dù sao, mình đánh giá đây là 1 thay đổi tích cực của Java giúp việc coding trở nên rõ ràng & thuận tiện hơn.

IV. Pattern Matching

Đây là tính năng mình đã rất mong đợi ở Java và cuối cùng nó đã có, thật tuyệt vời:

Object obj = getObject();
switch (obj) {
    case String s when s.length() > 5 -> System.out.println(s.toUpperCase());
    case String s                     -> System.out.println(s.toLowerCase());
    case Integer i                    -> System.out.println(i * i);
    case Position(int x, int y)       -> System.out.println(x + "/" + y);
    default                           -> {}
}

Nếu không có Pattern Matching, code của chúng ta sẽ khá tối như này:

Object obj = getObject();
if (obj instanceof String s && s.length() > 5)  System.out.println(s.toUpperCase());
else if (obj instanceof String s)               System.out.println(s.toLowerCase());
else if (obj instanceof Integer i)              System.out.println(i * i);
else if (obj instanceof Position(int x, int y)) System.out.println(x + "/" + y);

Ở góc nhìn của 1 Scala developer, Pattern Matching trong Scala thực sự mạnh và hữu ích trong rất nhiều hoàn cảnh. Khi quay lại code Java cảm thấy như đi lùi hàng trăm bước. Hiện tại với JDK21, Java vẫn chưa thể sánh được với Scala, nhưng mình mong đợi Java sẽ cải tiến nhiều hơn trong các version sau. Tính năng này sẽ tạo ra 1 thay đổi lớn trong tư duy và cách viết code. Mình rất háo hức được đọc các changelog tiếp theo.

V. New String Methods

Ở version này, đem đến nhiều method mới hữu ích:

  • String.indexOf(String str, int beginIndex, int endIndex): Tìm kiếm chuỗi trong khoảng index chỉ định
  • String.indexOf(char ch, int beginIndex, int endIndex): Tìm kiễm kí tự trong khoảng index chỉ định
  • String.splitWithDelimiters(String regex, int limit): Chia cắt chuỗi bằng regex với số lần chỉ định
String string = "the red brown fox jumps over the lazy dog";
String[] parts = string.splitWithDelimiters(" ", 5);

Output: 'the', 'red', 'brown', 'fox', 'jumps over the lazy dog'

Các method mới dành cho Emoj:

  • isEmoji(int codePoint)
  • isEmojiComponent(int codePoint)
  • isEmojiModifier(int codePoint)
  • isEmojiModifierBase(int codePoint)
  • isEmojiPresentation(int codePoint)
  • isExtendedPictographic(int codePoint)

Việc bổ sung các methods mới này, mình đánh giá không có nhiều tác động lắm

VI. Tổng kết

JDK21 mang lại nhiều tính năng tích cực và rất đáng hứa hẹn đặc biệt là Virtual Thread, Record & Pattern Matching. Phiên bản này sẽ tạo ra những thay đổi lớn về cách coding giống như JDK8 đã làm được với Lamda function.

JDK21 đã release, ngay bây giờ , bạn nên upgrade JDK của mình lên phiên bản mới để sử dụng các tính năng hữu ích trên.

Ở góc nhìn khác thì Scala đã đi trước Java ở rất nhiều điểm vì thế với mình các tính năng trong JDK21 không hề xa lạ hay khó hiểu. Với tần suất cập nhật 6 tháng 1 lần như hiện nay, mình tin rằng không lâu nữa khoảng cách giữa 2 ngôn ngữ sẽ không còn. Mình vẫn yêu thích Java & các công nghệ của nó.

Đây chỉ là bản tóm tắt của mình, hãy đọc release note để biết chi tiết hơn nhé.

Add a Comment

Scroll Up