Mục lục
Vừa qua Oracle đã phát hành Java 11 vào tháng 9 năm 2018 chỉ sau 6 tháng kể từ khi Java 10 được ra mắt.
Java 11 là phiên bản long-term support (LTS) kế tiếp sau Java 8. Đồng thời Oracle cũng ngưng hỗ trợ Java 8 vào tháng 1 năm 2019. Do chúng chúng ta nên nâng cấp lên phiên bản Java 11 để được cập nhật các tính năng mới cũng như sự hỗ trợ từ cộng đồng.
Chúng ta cũng cần lưu ý rằng Java 10 là phiên bản Oracle JDK miễn phí cuối cùng mà chúng ta có thể sử dụng cho mục đích thương mại mà không cần đến license. Bắt đầu Java 11, chúng ta sẽ phải trả phí cho các phiên bản Oracle JDK, tuy nhiên Oracle vẫn phát hành bản OpenJDK chúng ta có thể download mà không cần phải thanh toán một khoảng phí nào.
Các tính năng mới trong Java 11
String
Java 11 cung cấp thêm một số hàm mới trong String class như isBlank, lines, strip, stripLeading, stripTrailing và repeat.
Ví dụ chúng ta sẽ sử dụng các method trên để trích xuất một danh sách các dòng có dữ liệu (không được rỗng) trong một string cho trước.
String multilineString = "Deft helps \n \n developers \n explore Java."; List<String> lines = multilineString.lines() .filter(line -> !line.isBlank()) .map(String::strip) .collect(Collectors.toList()); assertThat(lines).containsExactly("Deft helps", "developers", "explore Java.");
Trong đó lines giúp chúng ta phân tích string ban đầu thành danh sách các string nhỏ đại diện cho mỗi dòng trong đó.
Sau đó sử dụng isBlank để loại bỏ các string rỗng tương ứng với các dòng rỗng nhận được tử lines. Hàm strip cung cấp tính năng tương tự như trim method mà chúng ta thường hay dùng, tuy nhiên nó cung cấp khả năng kiểm soát tốt hơn và hỗ trợ unicode.
Files
Giờ đây chúng ta có thể dễ dàng đọc hoặc ghi một chuỗi từ một File cách dễ dàng thông qua readString và writeString method được Files class cung cấp.
Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text"); String fileContent = Files.readString(filePath); assertThat(fileContent).isEqualTo("Sample text");
Convert collection sang Array
java.util.Collection interface chứa một default method mới có tên là toArray giúp chúng ta chuyển đổi từ một collection sang array cách dễ dàng.
List sampleList = Arrays.asList("Java", "Kotlin"); String[] sampleArray = sampleList.toArray(String[]::new); assertThat(sampleArray).containsExactly("Java", "Kotlin");
Not Predicate method
Ở phiên bản lần này, Predicate interface được thêm một static method là not, chúng ta có thể sử dụng nó để đặt một điều kiện phủ định.
List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " "); List withoutBlanks = sampleList.stream() .filter(Predicate.not(String::isBlank)) .collect(Collectors.toList()); assertThat(withoutBlanks).containsExactly("Java", "Kotlin");
Local-Variable Syntax trong Lambda
Java 11 hỗ trợ sử dụng local variable syntax (var keyword) trong lambda parameters. Chúng ta có thể sử dụng tính năng mới này để chỉnh sửa local variable.
Ví dụ chúng ta có thể mark @NonNull annotation lên local variable.
List<String> sampleList = Arrays.asList("Java", "Kotlin"); String resultString = sampleList.stream() .map((@Nonnull var x) -> x.toUpperCase()) .collect(Collectors.joining(", ")); assertThat(resultString).isEqualTo("JAVA, KOTLIN");
HTTP Client
HTTP client trông java.net.http package được giới thiệu từ Java 9 nay trở thành một tính năng tiêu chuẩn trong Java 11 với việc tối ưu tổng thể về mặt hiệu xuất, ngoài ra nó còn hỗ trợ cho cả 2 giao thức HTTP/1.1 và HTTP/2.
HttpClient httpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) .connectTimeout(Duration.ofSeconds(20)) .build(); HttpRequest httpRequest = HttpRequest.newBuilder() .GET() .uri(URI.create("http://localhost:" + port)) .build(); HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); assertThat(httpResponse.body()).isEqualTo("Hello from the server!");
Running Java file
Một trong những thay đổi lớn ở phiên bản này chúng ta có thể chạy trực tiếp một file Java mà khoong cần biên dịch thông qua javac.
Nếu như ở Java 8 các bạn phải chạy một HellWorld.Java thông qua các bước sau
javac HelloWorld.java $ java HelloWorld Hello Java 8!
Thì giờ đây chúng ta có thể chạy trực tiếp nó trên Java 11
$ java HelloWorld.java Hello Java 11!
No-Op Garbage Collector
Một trình thu gom rác mới được gọi là Epsilon được phát hành trong phiên bản Java 11, hiện nó chỉ được sử dụng với mục đích thực nghiệm.
Sở dĩ nó được gọi là No-OP là bởi vì mặc dù nó cấp phát bộ nhớ nhưng nó lại không thu hồi lại bất kỳ một dữ liệu rác nào. Do đó, Epsilon có thể áp dụng để mô phỏng các lỗi hết bộ nhớ.
Rõ ràng Epsilon sẽ không phù hợp với một ứng dụng Java chạy trên môi trường production. Tuy nhiên, có một số trường hợp sử dụng cụ thể có thể hữu ích:
- Performance testing
- Memory pressure testing
- VM interface testing and
- Extremely short-lived jobs
Flight Recorder
Java Flight Recorder (JFR) hiện là mã nguồn mở trong Open JDK, trong khi nó từng là sản phẩm thương mại trong Oracle JDK. JFR là một công cụ lập hồ sơ mà chúng ta có thể sử dụng để thu thập dữ liệu chẩn đoán và lập hồ sơ từ một ứng dụng Java đang chạy.
Java EE và CORBA
Java 9 đã thông báo ngừng sử dụng một số module trong Java EE và CORBA, trong Java 11 đã xoá hoàn toàn các module sau:
- Java API for XML-Based Web Services (java.xml.ws)
- Java Architecture for XML Binding (java.xml.bind)
- JavaBeans Activation Framework (java.activation)
- Common Annotations (java.xml.ws.annotation)
- Common Object Request Broker Architecture (java.corba)
- JavaTransaction API (java.transaction)
JMC và JavaFX
JDK Mission Control (JMC) không còn bên trong JDK. Phiên bản độc lập của JMC hiện có sẵn dưới dạng tải xuống riêng biệt. Điều này cũng tương tự với JavaFX.
Tóm lược
Nhìn chung phiên bản Java 11 có nhiều cải tiến hơn về syntax và hiệu suất. Tuy nhiên đáng tiếc là từ nay chúng ta không còn được dùng miễn phí Oracle JDK nữa, do vậy sẽ tốn một khoảng chi phí để bắt đầu phát triển một ứng dụng Java chạy trên Java 11 cho doanh nghiệp. Các bạn có thể sử dụng các phiên bản OpenJDK miễn phí để trải nghiệm các tính năng mới trong Java 11, tuy nhiên nó sẽ không ổn định bằng phiên bản oracle jdk trả phí.