STTTên phiên bảnNgày phát hành
1
Java SE 82014-03-18
2
Java SE 8 Update 52014-04-15
3
Java SE 8 Update 112014-07-15
4
Java SE 8 Update 202014-08-19
5
Java SE 8 Update 252014-10-14

Trong năm 2014, Oracle đã cho phát hành Java phiên bản 8 trong đó bổ sung thêm rất nhiều tính năng mới . Chúng ta sẽ đi vào phân tích một số tính năng quan trọng trong phiên bản này ^^.

1.Lamda Expressions

Tính năng đầu tiên, đồng thời là tính năng nổi bật nhất của Java8: hỗ trợ cú pháp Lambda,  đây dường như là cải tiến lớn nhất trong cú pháp lập trình Java kể từ thời điểm phát hành Generics  và Annotations trong Java 5.
 
Nó đã xóa bỏ tất cả các đoạn code rườm ra hiển nhiên. Cú pháp:
(argtype arg...) -> { return some expression.. probably using these arguments }

Áp dụng Lambda, một thread có thể được thay đổi như sau:

Runnable oldRunner = new Runnable(){
    public void run(){
        System.out.println("I am running");
    }
};
Runnable java8Runner = () ->{
    System.out.println("I am running");
};

Cú pháp Lambda trong Java cho phép tự suy luận kiểu dữ liệu. Hãy xem xét các ví dụ có sẵn sau đây:

Comparator c = (a, b) -> Integer.compare(a.length(), b.length());

Ở đây, các kiểu của a, b được suy luận thành kiểu String khi phương pháp so sánh Integer.compare được thực hiện.

Nếu bạn thành thạo ngôn ngữ Scala thì dấu “->” trong Lambdas được sử dụng để tách các khối lệnh là khá giống với dấu “=>” trong Scala.

2. Kiểu dữ liệu chung Generic

Lấy cảm hứng từ Lambdas, một tập hợp kiểu dữ liệu chung được sử dụng trong một phạm vi nhất định. Bạn không cẩn phải thực hiện ép kiểu trước khi gọi một phương thức của kiểu đó. Ví dụ:
SomeClass.method();

Có thể được gọi mà không cần quan tâm đến kiểu dữ liệu:

Kiểu dữ liệu được tự động suy luận giúp việc gọi các phương thức lồng nhau một cách tiện lợi hơn:

myCollection.sort().removeUseless().beautify();

3. Kiểu Stream Collection (java.util.stream)

Stream trở thành một iterator cho phép chạy tuần tự thông qua collection của nó. Cùng với Lambdas, đây là một tính năng đáng chú ý để xem. Bạn có thể sử dụng các stream để thực hiện các chức năng tính toán như Filter hoặc Map/reduce thông qua collection. Streams có thể chạy tuần tự hoặc song song theo ý muốn của lập trình viên. Chế độ song song được sử dụng để tích hợp, liên lạc các framework hoặc tận dụng tối đa sức mạnh của chíp đa nhân.Ví dụ:
List guys = list.getStream.collect(Collectors.toList())

cũng có thể được thực hiện song song như sau:

List guys = list.getStream.parallel().collect(Collectors.toList()

Một ví dụ khác rất tốt để thực hiện reduce một colletion thành một giá trị bằng cách gọi giải thuật reduce.

int sum = numberList.stream().reduce(0, (x, y) -> x+y);

hoặc,

int sum = numberList.stream().reduce(0, Integer::sum);

4. Giao diện chức năng (java.util.function)

Các giao diện này có chứa một số phương thức mặc định mà không cần phải được thực hiện cho phép chạy trực tiếp từ giao diện. Điều này rất hữu ích với các mã có sẵn – thay đổi giao diện không yêu cầu tất cả các Class cài đặt các phương thức mới. Điều này cũng tương tự như đặc điểm trong Scala..

5. Nashorn – Node.js trên JVM

Đây là javascript engine cho phép chúng ta chạy javascript trên một JVM. Nó tương tự như engine V8 cung cấp bởi chrome dùng để chạy Node.js. Nó tương thích với các ứng dụng Node.js trong khi đồng thời hỗ trợ các thư viện Java được gọi thông qua mã javascript chạy trên máy chủ. Thật thú vị khi nó kết hợp khả năng mở rộng và tính không đồng bộ của Node.js với tính an toàn và phổ biến rộng rãi của ngôn ngữ Java.

6. Thay đổi Date/Time (java.time)

http://download.java.net/jdk8/docs/api/java/time/package-summary.html
Date / Time API được chuyển đến gói java.time cùng với định dạng thời gian Joda.

7. Kiểu Annotations

Với Java 8 các annotation có thể được sử dụng để mô tả các kiểu dữ liệu chung.
Ví dụ:
List<@Nullable String>

Cách khai báo này là hữu ích trong một số trường hợp. Ngoài mô tả các kiểu dữ liệu chung, nó còn được sử dụng trong các hàm khởi tạo và ép kiểu chuyển đổi.

new @NonEmpty @Readonly List(myNonEmptyStringSet)
new @Interned MyObject()
 
myString = (@NonNull String) myObject;

Ngay cả trong các khai báo mảng dữ liệu:

@NotNull String[] arr;

Các thuộc tính RuntimeVisibleTypeAnnotations và RuntimeInvisibleTypeAnnotations được sử dụng để quyết định việc file .class lưu các thông tin annotations.

8. Những thay đổi tích cực khác

Reflection api được cải tiến nhẹ với sự hỗ trợ của TypeName, GenericString,…
Phương pháp String.Join () là một bổ sung tích cực. ví dụ:
String abc= String.join(" ", "Java", "8");

Trong gói Collections, các giao diện Comparator được cải tiến và bổ sung phương thức ví dụ như reversed (đảo ngược), giúp việc so sánh trở nên tuỳ biến dễ dàng trên nhiều lĩnh vực. Các thư viện khác như truy cập đồng thời và NIO cũng đã được cập nhật nhưng không có gì đáng chú ý để theo dõi và phù hợp với những thay đổi trong api.

Nhìn chung, Java8 nhận được đánh giá tốt lấy cảm hứng từ những ý tưởng tốt đẹp của Scala / Clojure cho việc cải thiện cú pháp của nó và tăng khả năng tìm kiếm.

Học lập trình Java trực tuyến


/* Đỗ Minh Hiền */