Những điểm mới trong Java 8

8 bình luận

Gần 2 năm rưỡi sau khi phiên bản Java 7 ra đời, ngày 18/3/2014, Oracle chính thức giới thiệu thế hệ tiếp theo: Java 8. Phiên bản mới này được xem là Java-7-hoàn-thiện-hơn bởi vì nhiều tính năng quan trọng trong Java 8 theo kế hoạch ban đầu thì thuộc về Java 7, nhưng các chậm trễ trong quá trình phát triển đã khiến Oracle quyết định ra đời Java 7 gọn nhẹ hơn, với lời hứa sẽ giới thiệu những tính năng còn thiếu trong phiên bản kế tiếp.

Bài viết này giới thiệu những điểm nổi bật nhất trong phiên bản Java 8, với giả định bạn đọc đã có kiến thức cơ bản về ngôn ngữ Java trước khi đọc bài.

Một vài link có thể hữu ích cho bạn:

Java 8 sẽ bản chính thức ngày 18/3/2014

  • Tải về JDK™ 8 tại website của Oracle
  • Trường hợp muốn dùng IDE đầy đủ, có thể tải về NetBeans
  • Các đặc điểm mới nhất của Java 8 được mô tả tại ĐÂY (nhiều nội dung trong bài viết cũng tham khảo từ đây)
  • Trường hợp chỉ muốn chạy phiên bản mới nhất, có thể tải về JRE 8

Khuyến cáo của txnam.net: bạn chỉ nên sử dụng bản x86 (32 bit) bất kể máy bạn chạy hệ điều hành 32 hay 64 bit.

Một tin có thể không vui cho các lập trình viên Việt Nam: java 8 không còn hỗ trợ Windows XP nữa!!!

Bây giờ chúng ta hãy nói về những điểm mới trong Java 8.

Lambda Expressions (biểu thức lambda)

Đây là tính năng được trông đợi nhất trong Java 8, cung cấp khả năng viết các anonymous function types, giúp mã java trở nên ngắn gọn hơn

// mã java thông thường
doSomething(new CheckAdapter() {
    public boolean isOK(int value) {
        return 100 == value;
}
}); // cũng làm những việc trên, nhưng viết bởi biểu thức lambda doSomething(value -> 100 == value);

Cú pháp chung của biểu thức lambda

<tham-số> -> <biểu-thức>

hoặc

(<danh-sách-tham-số>) -> { <các-câu-lệnh> }

Một vài ví dụ về biểu thức lambda

() -> 5                              // biểu thức lambda không tham số, trả về 5
x -> 2 * x                           // biểu thức lambda tham số x, trả về 2x
(x, y) -> x – y                      // biểu thức lambda hai tham số x và y, trả về hiệu
(int x, int y) -> x + y              // biểu thức lambda hai số nguyên x và y, trả về tổng
(String s) -> System.out.print(s)    // biểu thức lambda tham số chuỗi s, in ra s

Với cách sử dụng biểu thức lambda, việc viết mã xử lý sự kiện trở nên đơn giản hơn bao giờ hết

// cách viết java thông thường, sử dụng class vô danh
btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println("Hello World!");
    }
});

// cách viết sử dụng biểu thức lambda
btn.setOnAction(event -> System.out.println("Hello World!"));

Engine Nashorn

Nashorn là một động cơ thực thi javascript mới, tương tự như các động cơ V8 của trình duyệt Chrome hay động cơ SquirrelFish của WebKit. Từ năm 1997, Java đã có thể làm việc (hạn chế) với javascript thông qua engine Rhino; trong Java 7, việc thực thi javascript trên JVM thông qua cơ chế invokeDynamic. Với Java 8, bằng việc tích hợp hoàn toàn Nashorn vào JVM, lập trình viên có thể sử dụng javascript khai thác các thư viện có sẵn của java và ngược lại. Theo thử nghiệm thì Nashorn chạy nhanh gấp 5 lần Rhino và đòi hỏi ít bộ nhớ hơn.

import javax.script.*;

public class EvalFile {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");

        // thực hiện hàm javascript
        engine.eval("print('Hello, World')");

        // dùng class java đọc file javascript rồi thực hiện
        engine.eval(new java.io.FileReader("script.js"));

        // tạo một đối tượng trong javascript, đối tượng này có hàm run()
        engine.eval("var obj = new Object()")
        engine.eval("obj.run = function() { print('obj.run() method called') }");

        // tham chiếu đối tượng từ java và sử dụng thread để thực hiện hàm run()
        Object obj = engine.get("obj");
        Invocable inv = (Invocable) engine;
        Runnable r = inv.getInterface(obj, Runnable.class);
        Thread th = new Thread(r);
        th.start();
        th.join();
    }
}

Các phương thức mặc định trong Interface

Mặc định ở đây nghĩa là phần mã thực thi đã được viết sẵn, nên khi kế thừa interface, nếu ta không viết mã cho phương thức thì phần mã mặc định sẽ được thực hiện. Xem ví dụ dưới đây để hiểu rõ hơn

// định nghĩa một interface với method có mã viết sẵn (cần có chữ default ở phía trước)
public interface MyInterface {
    default void myMethod(){
       System.out.println("I'm a method implemented into an interface ... Who are you ?");
    }
}

// kế thừa interface và không viết mã cho phương thức
public class MyClass implements MyInterface {
}

// thực hiện thử xem sao?
MyClass myClass = new MyClass();
myClass.myMethod();

Sắp xếp song song trên Array

Lớp java.util.Arrays bổ sung phương thức parallelSort() cho phép thực hiện việc sắp xếp các phần tử trên array một cách song song

Integer[] array = ...;

// xếp 10 phần tử đầu tiên (tăng dần)
Arrays.parallelSort(array, 0, 10);

// xếp 10 phần tử cuối cùng (giảm dần)
Arrays.parallelSort(array, array.length - 10, array.length, Collections.reverseOrder());

// xếp tăng dần toàn bộ mảng
Arrays.parallelSort(array);

// xếp giảm dần toàn bộ mảng
Arrays.parallelSort(array, Collections.reverseOrder());

Mã hóa & giải mã Base64

Trong các phiên bản trước mã hóa Base64 thực hiện bởi thư viện bổ sung (sun.misc.BASE64Encoder và sun.misc.BASE64Decoder), java 8 cung cấp 2 class java.util.Base64.Encoder và java.util.Base64.Decoder

String asB64;
byte[] asBytes = Base64.getDecoder().decode("SmF2YTggQmFzZTY0IEVuY29kaW5nICYgRGVjb2Rpbmc=");
try {
    // mã hóa
    asB64 = Base64.getEncoder().encodeToString("Java8 Base64 Encoding & Decoding".getBytes("utf-8"));
    System.out.println(asB64);
    // giải mã
    System.out.println(new String(asBytes, "utf-8"));
} catch (UnsupportedEncodingException ex) {
    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}

Một số thay đổi nhỏ khác

  • Unicode theo chuẩn 6.2 (java 7 là chuẩn 6.0)
  • Nâng cấp JDBC lên bản 4.2: bỏ JDBC-ODBC Bridge, JDK mặc định có thêm Java DB 10.10
  • Gói java.util.function bổ sung thêm các interface: Function, Predicate, Consumer, Supplier
  • Gói java.util.stream bổ sung thêm 2 interface: Stream, Collector
  • Reflection đơn giản hơn, có thể lấy tên của tham số trong lúc chạy (khi dịch bằng javac phải thêm tham số -parameters)
  • JavaFX có thể chạy trực tiếp bởi java.exe, hỗ trợ cả nền tảng ARM
  • Thêm ghi chú về kiểu dữ liệu
@Nullable Object obj = null;    // biến có thể null
@NonNull Object obj2;           // biến phải khác null

Java 9 và kế hoạch cho tương lai

Oracle đã bắt đầu quá trình phát triển phiên bản tiếp theo là Java 9 với dự kiến phát hành trong năm 2016. Chưa có danh sách các tính năng sẽ đưa vào Java 9 ngoài những mục tiêu chung chung như hỗ trợ ứng dụng cần heap lớn, tích hợp tốt hơn với CPU theo hướng thực hiện song song nhưng tác vụ xử lý nặng, JVM sẽ tự điều chỉnh để chạy ngày càng tốt hơn,… Java 9 là bước đệm để java chuyển hoàn toàn sang thế hệ 64-bit, từ Java 10 thì JDK sẽ chỉ có phiên bản x64.

Java 8 hay và dở

Đối với nhiều lập trình viên java lâu năm, java 8 là phiên bản đáng mong đợi, với biểu thức lambda và động cơ Nashorn, năng suất của lập trình viên có thể tăng đáng kể.

Đối với người mới học java, những cải tiến này làm java mất tính trong sáng và có thể gây bối rối (đặc biệt là phương thức default cho interface).

Đối với sự phát triển ngôn ngữ, từ một ngôn ngữ tiên phong khi mới ra đời (1995), java đã dần dần mất đi vị trí dẫn đầu và định hướng cho sự phát triển các ngôn ngữ lập trình. Những cải tiến như biểu thức lambda, phương thức mặc định cho interface hay các phương thức sắp xếp song song trên Array,… là sự học tập một cách vụng về các tiếp cận vấn đề của C#.

txnam.net, tham khảo từ nhiều nguồn

8 bình luận cho Những điểm mới trong Java 8

  • sonhoaian1991Ân  says:

    Phiên bản 8 này của Java còn lược bỏ một số thư viện và thay bằng các thư viện khác khó dùng hơn nữa.

  • Le Quang Minh  says:

    biểu thức lambda có cũng đc, chẳng có cũng chẳng sao. mình thấy cái đó chẳng có j quan trọng, còn những cái khác thì tốt hơn

  • Nguyên Trương  says:

    .net đã có lâu rồi giờ java mới có hic, hy vọng cải tiến thêm nữa

  • Tuấn Anh  says:

    Hic đến java 10 thì những máy cấu hình thấp không chạy được thì làm thế nào, mà sao lại không muốn bản 32 bit nữa vậy ?

    • Trương Xuân Nam  says:

      Đợi java 10 cũng phải năm 2018, lúc đó lo gì máy cấu hình thấp hả bạn? thấp thì cũng x64 hết rồi!

  • hungdien  says:

    tại sao “bạn chỉ nên sử dụng bản x86 (32 bit) bất kể máy bạn chạy hệ điều hành 32 hay 64 bit.” ??

    • Trương Xuân Nam  says:

      Về performance thì không chênh nhau bao nhiêu, nhưng bản x64 có nhiều trục trặc khi làm việc với các dev tools (như eclipse chẳng hạn), vì thế dùng bản x86 để tránh những vấn đề không đáng có. Nếu là người dùng cuối thì cài bản nào cũng được.

Bình luận: