Tuốt tuồn tuột về Java 8 – những thay đổi lớn!

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Java 8 xuất hiện với nhiều cải tiến rõ rệt, hãy cùng Kieblog tìm hiểu xem nhưng thay đổi lớn nào đã giúp Java 8 trở nên mạnh mẽ và linh động hơn.

Bài viết dưới đây liệt kê ra 5 THAY ĐỔI LỚN có ở JAVA 8. Hãy cùng đọc nhé!

  10 câu hỏi javascript để nâng cao trình độ
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

1. Phương thức forEach()

Cập nhật này đúng ra thì là quá chậm trễ so với .NET. Visual Basic hay C# đều đã có forEach từ lâu. Hãy quên đi những câu for xưa cũ để chuyển qua sử dụng ForEach

Phương thức này cũng được hỗ trợ tốt bởi Iterator (java.lang.Interable). Cùng xem xét ví dụ add tất cả các đối tượng i vào list như sau:

// Cách cũ truyền thống từ xưa vẫn sử dụng
// Nhìn thôi đã thấy rườm rà, chán
List<Integer> listDanhSach = new ArrayList<Integer>();
for(int i=0; i<69; i++) listDanhSach.add(i);

// Loop với Iterator
Iterator<Integer> it = listDanhSach.iterator();
while(it.hasNext()){
Integer i = it.next();
}

Bùm, với Java 8, chỉ đơn giản là:

// Easy for ence với forEach
listDanhsachA.forEach(a -> listDanhSachB.add(a.getB()));

2. Java 8 Lambda

Nhắc tới Java 8 mà không nhắc tới Lambda qủa thật là một sự thiếu sót to lớn. Lambda giúp cho functional programming (lập trình hàm) trở nên đơn giản hơn nhiều.

Syntax: parameter -> expression body. Dấu mũi tên biểu thị cho reference (tham chiếu tới cái gì đó)

Java Lambda liệt kê thành 4 loại sau đây:

Optional type declaration − No need to declare the type of a parameter. The compiler can inference the same from the value of the parameter

Không cần khai báo tham số. Trình compiler có thể tự suy luận các tham số cần thiết

Optional parenthesis around parameter − No need to declare a single parameter in parenthesis. For multiple parameters, parentheses are required.

Trường hợp có sử dụng tham số (nhiều hơn 2), bắt buộc phải khai báo bên trong cặp ngoặc ().

Optional curly braces − No need to use curly braces in expression body if the body contains a single statement.

Loại này không cần dấu ngoặc nhọn, nếu phần xử lí chỉ đơn giản được gói gọn trong phần body

Optional return keyword − The compiler automatically returns the value if the body has a single expression to return the value.

Loại sử dụng từ khóa return. Trình compiler sẽ tự động return về giá trị nếu body có một biểu thức trả về các giá trị.

Ông nào muốn tìm hiểu sâu hơn về Lambda có thể tham khảo bài viết về Java 8 Lambda ở Kieblog

3. Stream API

Sự xuất hiện của Stream trong Java 8 như là sự cứu rỗi cho các đoạn source loằng ngoằng trong Java. Nay với Stream, tất cả chỉ gói gọn trong một dòng code.

Đối với Stream thì Kieblog đã có một bài viết tương đối chi tiết và đặc sắc (Tuốt tuồn tuột về Stream trong Java 8).

4. Method reference

So với các ngôn ngữ như Scala hay Ruby on Rail đã có từ lâu. Method Reference cũng chỉ mới xuất hiện trên Java 8, khá trễ nhưng có còn hơn không.

Từ sau khi được release trên bản Java 8, Method Reference giúp code dễ đọc hơn, đỡ rườm rà, một số trường hợp còn dễ hiểu hơn cả Lambda.

Sơ bộ có thể chia Method Reference thành 4 loại chính:

4.1 Reference tới phương thức static

Các refer này khá sử dụng, với syntax là ContainingClass::methodName.

Cùng xem xét ví dụ sau đây:

// Cách viết này sử dụng lambda kiểm tra i có tồn tại trong list không
boolean isVisible = list.stream().anyMatch(i -> Item.isVisible(i));

Còn đây là cách sử dụng Java 8 method reference

// Chỉ đơn giản sử dụng ::, không cần care param, khá gọn
boolean isVisible = list.stream().anyMatch(Item::isVisible);

4.2 Reference tới instance của method

Khi new lên một instance method. Syntax có hơi khác hơn chút xíu: containingInstance::methodName

// Các dùng tương tự
Item item = new Item()
boolean isVisible = list.stream().anyMatch(item::isVisible())

4.3 Reference tới Instance Method của Object các kiểu đặc biệt

Loại này có syntax: ContainingType::methodName. Trường hợp nếu sử dụng với String, Long, Integer, … đều sử dụng được tất cả các instance method

// Tính tổng các String item trong list không empty
int count = list.stream().filter(String::isEmpty).count();

4.4 Reference tới Constructor

Loại này có ít bạn nhớ (sử dụng với từ khóa ::new), nhưng thực tế vẫn có thể reference tới constructor theo kiểu như sau:

// Tính tổng các String item trong list không empty
Stream<Item> stream = list.stream().map(Item::new);

5. Optional <T>

Trước khi Java 8 xuất hiện, để handle các trường hợp xuất hiện Exception thường rất vất vả. Catch đủ thứ, lỗi nào có thể văng ra thì catch lỗi đó. Đôi khi là hoa cả mắt xem lỗi đó catch ở đâu.

Class Optional <T> xuất hiện, giúp handle các khả năng văng NPE (Null Pointer Exception).

Handle NPE với Optional rõ ràng dễ hơn hẳn, cho phép ta cấu hình một số việc cần làm khi gặp NPE, trường hợp không có, chỉ đơn giản là thực thi một đoạn code nào đó.

// Lấy ra một list, nếu list khác null thì trả về list
// Nếu list null thì cần new ArrayList<>
List<String> listA = doAnyThingToGetList();
List<String> listB = list != null ? list : new ArrayList<>();

Sau khi áp dụng Optional:

// Đối với Java 8 Optional - chỉ đơn giản là một dòng code
List<String> listB = doAnyThingToGetList().orElseGet(() -> new ArrayList<>());

6. Tham khảo

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm java lương cao hấp dẫn trên TopDev