Tổng hợp các tính năng và cú pháp mới trong java 8

4102

Java 8 là một bước tiến đỉnh cao cho ngôn ngữ Java. Những cập nhật mới của Java 8 là một việc lớn đối với Android và sẽ giúp cho các nhà phát triển dễ dàng hơn trong việc tạo ra các ứng dụng mới và dọn sạch mã hiện có.

Tóm lại, java 8 là :

“Tạo ra code sạch hơn và tinh giản toàn bộ quá trình”

Sự thay đổi từ Java 7 sang 8 đánh dấu một sự cập nhật lớn cho nền tảng mà Android và nhiều ứng dụng của nó được xây dựng.

Android O được công bố với việc sử dụng Java 8 để cải thiện hiệu năng của toàn bộ ứng dụng.

 

1- Giới thiệu

Từ khi Java ra đời và sự nâng cấp về mặt cú pháp và các tính năng, có vài dấu mốc thực sự quan trọng:
  • Java 1.0: Bắt đầu một ngôn ngữ lập trình.
  • Java 1.1, 1.2, 1.3, 1.4 về mặt cú pháp và tính năng không có nhiều thay đổi lớn.
  • Java 1.5 (Hay còn gọi là Java 5) đã có những thay đổi lớn, với việc đưa vào một vài khái niệm.
    • Generic
    • Autoboxing/Unboxing
    • Nâng cấp tính năng cho vòng lặp for (“foreach”).
    • Các kiểu liệt kê có tính an toàn (Type-safe enumerations).
    • Varargs
    • Nhập khẩu tĩnh (Static import)
    • Metadata
  • Java 6,7 không có nhiều thay đổi lớn về mặt ngôn ngữ.
  • Java 8 có một sự thay đổi lớn về mặt ngôn ngữ. Với việc đưa vào một vài khái niệm và tính năng:
    • Phương thức mặc định cho interface (Default interface methods)
    • Biểu thức Lambda (Lambda expressions)
    • Method references
    • Annotation có thể lặp (Repeatable annotations)
    • Stream

2- Phương thức mặc định cho Interface

Java 8 cho phép bạn thêm một method không trìu tượng vào interface bằng cách sử dụng từ khóa default. Các method này được hiểu nhưcác phương thức mở rộng. Đây là ví dụ đầu tiên của bạn:

Khi đó chúng ta chỉ cần implement chỉ cần thi hành method trừu tượng

3- Functional Interface (Interface tính năng)

 

Java 8 coi các Interface có duy nhất một method trừu tượng là các Functional Interface. Bạn có thể sử dụng annotation@FunctionalInterface để đánh dấu một interface của bạn là Functional Interface, điều này không bắt buộc, tuy nhiên trình biên dịch của Java sẽ thông báo lỗi cho bạn nếu vô tình thêm một method trìu tượng khác nữa vào interface có đánh dấu bởi annotation này.
Dưới đây là một số ví dụ thực hành với @FunctionalInterface:
Ví dụ dưới đây là một FunctionalInterface hợp lệ vì có duy nhất một method trừu tượng.

 

4- Biểu thức Lambda

Một trong những tính năng mạnh mẽ trong java 8 là Lambda Expression, nó cho phép giữ cho cú pháp rõ ràng hơn và ít thổi phồng lên.

Trước java 8 nó sẽ không có nếu không thêm tool , nhưng bây giờ Lambda Expression sẽ làm việc trên các phiên bản của Android từ 2,3 (Gingerbread) trở lên.

Tóm lại, biểu thức lambda là một thay thế của lớp bên trong vô danh khi cung cấp trình nghe sự kiện.

Ví dụ: hãy xem xét trình lắng nghe nhấp chuột cơ bản và sử dụng java8:

 

5- Functional Interface API

Java 8 xây dựng sẵn một số lượng khá lớn các Functional Interface, chúng nằm trong package java.util.function, tại đây tôi sẽ hướng dẫn bạn sử dụng một số Interface đó, để hiểu hơn về biểu thức Lambda và sự tiện dụng của chúng.

5.1- java.util.function.Consumer

Consumer là một Functional interface xây dựng sẵn của Java 8, nó có một method trìu tượng duy nhất chấp nhận một tham số đầu vào, và method này không trả về gì cả.

Sử dụng method List.forEach(Consumer):

ConsumerExample.java

 

5.2- java.util.function.Predicate

Predicate là một Functional interface xây dựng sẵn của Java 8, nó có một method trừu tượng duy nhất chấp nhận một tham số đầu vào, và method trả về giá trị boolean (true/false). Method này dùng để đánh giá tham số đầu vào phù hợp với một logic gì đó hay không.

Ví dụ sau đây sẽ lọc một danh sách các tự nhiên và in ra danh sách các số lẻ, sử dụng Predicate theo cách Java8, và trước Java8.

 

5.3- java.util.function.Function

Function là một Functional interface xây dựng sẵn của Java 8, nó có một method trừu tượng duy nhất chấp nhận một tham số đầu vào, và method trả về một đối tượng khác.

Ví dụ: Cho một danh sách các String, in ra các String  trong tập hợp dưới dạng chữ hoa.

 

Một số Functional interface tương tự:

  • java.util.function.IntFunction<R>
  • java.util.function.DoubleFunction<R>
  • java.util.function.LongFunction<R>

 

5.4- java.util.function.Supplier

Supplier là một Functional interface xây dựng sẵn của Java 8, nó có một method trừu tượng duy nhất không tham số, và trả về một đối tượng.


 

Một số Functional Interface tương tự:

  • java.util.function.BooleanSupplier
  • java.util.function.IntSupplier
  • java.util.function.DoubleSupplier
  • java.util.function.LongSupplier

 

 

6- Method reference

Đó là một tính năng có liên quan đến biểu thức Lambda. Nó cho phép bạn tham chiếu tới một method hoặc một constructor mà không cần thực thi chúng. Method references và Lambda là tương tự nhau, vì cả hai yêu cầu một loại mục tiêu là một Functional Interface tương thích.
Java 8 cho phép bạn truyền một tham chiếu của một method hoặc một constructor thông qua việc sử dụng từ khóa ::
Trước khi đi vào vấn đề hãy xem một ví dụ đơn giản.
MyFunction là một Functional Interface. Nó định nghĩa ra một method có 2 tham số int a và b, và trả về giá trị int.

MyMathUtils là class có 2 method tĩnh để tính tổng và tính hiệu 2 số int.

Thông qua ví dụ ở trên bạn có thể thấy cách thức sử dụng từ khóa :: để truyền vào tham chiếu của một method. Nếu bạn gọi một method, mà trong method đó có một tham số là Functional Interface, bạn có thể truyền vào một tham chiếu method có cấu trúc giống với cấu trúc method định nghĩa trong Functional interface.

7. Enhancing Null Safety

Bất kì một develop cũng không thể quên được “The NullPointerExceptions“, và đó là những gì mà chuyên gia java nghĩ và giới thiệu Optional.

Optional là một đối tượng container object có thể hoặc không thể chứa một giá trị khác null. Optional object được sử dụng để đại diện cho null với giá trị vắng mặt.

Để tương tác với giá trị, Optional cung cấp một tập hợp các phương thức hữu ích trừu tượng để check null.

Điều này cho phép chúng tôi có thêm mã súc tích và khai báo tập trung vào các chi tiết mà chúng tôi quan tâm.

8. Stream Api

Stream là một lớp abstract mới được giới thiệu trong Java 8. Stream cho phép chúng tôi xử lý dữ liệu theo cách khai báo hoặc nói một cách quản lý khác.
Sử dụng stream, developer không phải lo lắng về sự đồng thời và quản lý luồng vì nó xử lý dữ liệu khổng lồ rất hiệu quả.
Dưới đây là ví dụ về stream api 0 hiển thị những từ bắt đầu bằng chữ ‘a’.

Tuy nhiên stream api chỉ support api >24 trong android.

Điều kiện tiên quyết để sử dụng JAVA 8 trong studio android

  1. JDK 8 (Khi phát triển các ứng dụng cho Android, việc sử dụng các tính năng ngôn ngữ Java8 là tùy chọn. Bạn có thể giữ giá trị tương thích nguồn và đích của dự án được đặt thành Java 7, nhưng bạn vẫn phải biên dịch bằng JDK 8.)
  2. Trình biên dịch JACK
  3. Android studio 2.1 trở lên (Vì Jack chỉ được hỗ trợ trên Android Studio 2.1 trở lên nên nếu bạn muốn sử dụng các tính năng ngôn ngữ Java 8, bạn cần phải sử dụng Android Studio 2.1 và cao hơn để xây dựng ứng dụng của bạn.)

Configure Gradle trong android studio để sử dụng java 8

BỎ QUA BƯỚC CONFIGURA NẾU BẠN ĐANG SỬ DỤNG ANDROID STUDIO 3.0

Để bật các tính năng ngôn ngữ Java 8 và Jack cho dự án của bạn, hãy nhập các thông số sau vào tệp build.gradle cấp build.gradle bạn:

Nguồn: viblo.asia và  o7planning