Những điểm mới của Java 12

Java 12 chính thức được tung ra vào ngày 19/03/2019 với rất nhiều tính năng mới. So với phiên bản gần nhất là 11 thì phiên bản JDK 12 có khoảng 90 điểm và 109 so với bản 10. Các thay đổi này tạm nhóm trong 4 nhóm chính như sau: Ngôn ngữ Java, thư viện, JVM (máy ảo java) và các tính năng khác.

Thay đổi về ngôn ngữ

Điểm đáng chú ý nhất trên phiên bản JDK 12 này là biểu thức switch (switch expression – JEP 325). Bằng cách mở rộng câu lệnh switch này mà lập trình viên có thể sử dụng như một câu lệnh hoặc một biểu thức.

Ví dụ về câu lệnh switch truyền thống:

int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
throw new IllegalStateException("Huh? " + day);
}

Bây giờ bạn có thể viết thành dạng sau:

int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Huh? " + day);
};

Quan sát vào cú pháp mới này ta có thể nhận thấy có 2 thay đổi ở đây. Thứ nhất là thay vì phải chia từng trường hợp một thì ta có thể gom thành 1 nhóm, phân tách nhau bởi dấu phẩy (“,”). Điểm thứ 2 là toán tử Lambda (->) được sử dụng để đơn giản hóa cách chúng ta thể hiện giá trị được trả về từ biểu thức switch.

Thư viện (Libraries)

Có một thay đổi nhỏ rất hữu ích đó là Stream API có 1 Collector mới, được cung cấp bởi lớp Collectors. Collector mới này thu được bằng cách sử dụng phương thức teeing. Teeing collector nhận vào 3 đối số, 2 collectors, và một BiFunction. Để hiểu rõ hơn về điểm này các bạn có thể xem sơ đồ sau:

Tất cả các giá trị từ input stream sẽ được truyền vào mỗi collector. Kết quả của mỗi collector sẽ được truyền đi dưới dạng đối số cho BiFunction để xử lý và đưa ra kết quả cuối cùng.

Để hiểu rõ hơn về khái niệm này, chúng ta có thể xem ví dụ đơn giản sau, về cách tính trung bình.

/* Assume Collectors is statically imported */
double average = Stream.of(1, 4, 2, 7, 4, 6, 5)
.collect(teeing(
summingDouble(i -> i), 
counting(),
(sum, n) -> sum / n));

Collector đầu tiên sẽ tính tổng của các số, collector thứ 2 sẽ thực hiện đếm số lượng số. BiFunction sẽ thực hiện lấy tổng chia số lượng ra số trung bình.

java.io

InputStream skipNBytes(long n): hàm này sẽ bỏ qua và từ chối chính xác n bytes dữ liệu. Nếu n bằng 0 hoặc nhỏ hơn thì sẽ không có byte nào được bỏ qua.

java.lang

Trong package java.lang có thêm một package con là: java.lang.constant

JVM Constants API cung cấp các loại tham chiếu tượng trưng để mô tả cho từng dạng hằng số (class, loadable constant, MethodHandleMethodHandle constant, and MethodType constant). Các class sau sẽ có thêm hàm describeConstable() 

  • Class
  • Double
  • Enum
  • Float
  • Integer
  • Long
  • String
  • MethodHandle
  • MethodType
  • VarHandle

Các class sau sẽ chứa 1 hàm resolveConstantDesc():

  • Double
  • Enum.EnumDesc
  • Float
  • Integer
  • Long
  • String

java.lang.Character

Các class con đã được cập nhật để thêm các khối Unicode mới.

  • Chess Symbols
  • Mayan numerals
  • Sogdian
  • Old Sogdian

java.lang.String

indent(): thêm các ký tự khoảng trắng vào đầu chuỗi. Nếu giá trị truyền vào là một số âm thì số lượng các ký tự khoảng trắng tương ứng ở đầu chuỗi sẽ bị lược bỏ.
transform(): phương thức này cho phép chúng ta áp dụng một biểu thức lambda vào một chuỗi. Ví dụ:

String str = "1000";       
Integer integer = str.transform(Integer::parseInt);
System.out.println(integer);

java.lang.invoke

VarHandle: thêm hàm toString, trả về một mô tả ngắn gọn
java.net.SecureCacheResponse và java.net.ssl.HttpsConnection có phương thức mới: getSSLSession()

java.nio.files

Class Files có thêm phương thức mới: mismatch(), phương thức này sẽ tìm và trả về vị trí đầu tiên của byte không match trong nội dung của 2 file, trả về -1L nếu match.

Leave a comment

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *