+2

Java 8 cho Android

Java 8 là một bước tiến lớn đối với ngôn ngữ lập trình và bây giờ, với việc phát hành Android Studio 3.0, các nhà phát triển Android cuối cùng đã có quyền truy cập vào tích hợp hỗ trợ một số tính năng quan trọng nhất của Java 8.

Trong phần này, chúng tôi ta khám phá các tính năng của Java 8 mà bạn có thể bắt đầu sử dụng trong dự án Android của mình ngay hôm nay. Trong phần Biểu thức Lambda, chúng ta sẽ thiết lập phát triển của mình để sử dụng hỗ trợ Java 8 được cung cấp bởi bộ công cụ mặc định của Android, trước khi xem xét kỹ lưỡng các biểu thức lambda.

Trong bài đăng này, chúng ta sẽ xem xét hai cách khác nhau để bạn có thể khai báo các phương pháp không trừu tượng trong các interface của bạn (không có trong các phiên bản Java trước đó). Chúng ta cũng sẽ trả lời câu hỏi, bây giờ các interface có thể thực hiện các phương thức, chính xác là sự khác biệt giữa các lớp trừu tượng và các interface?

Tôi cũng sẽ giới thiệu một tính năng của Java 8 cho phép bạn tự do sử dụng cùng một chú thích nhiều lần như bạn muốn trong cùng một vị trí, đồng thời vẫn tương thích ngược với các phiên bản trước của Android.

Nhưng trước tiên, chúng ta hãy xem một tính năng của Java 8 được thiết kế để sử dụng kết hợp với các biểu thức lambda.

Viết code gọn gàng hơn với Lambda, cùng với các phương thức tham chiếu

Khi một biểu thức lambda chỉ đơn giản gọi một phương thức duy nhất đã có một tên, bạn có thể láy ngay cả code từ dự án của bạn bằng cách sử dụng một phương thức tham chiếu.

Ví dụ, biểu thức lambda này thực sự chỉ chuyển hướng công việc sang một phương thức handleViewClick hiện có:

  FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  fab.setOnClickListener(view -> handleViewClick(view));
}
 
private void handleViewClick(View view) {
 
}

Trong kịch bản này, chúng ta có thể tham chiếu phương thức này bằng tên, sử dụng toán tử tham chiếu :: method . Bạn tạo kiểu tham chiếu phương thức này, sử dụng định dạng sau:

Object/Class/Type::methodName

Trong ví dụ Floating Action Button, chúng ta có thể sử dụng tham chiếu phương thức tham chiếu làm phần thân của biểu thức lambda :

  FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  fab.setOnClickListener(this::handleViewClick);
}

Lưu ý rằng phương thức được tham chiếu phải có cùng tham số với interface-trong trường hợp này, đó là View.

Bạn có thể sử dụng toán tử tham chiếu phương pháp (: 😃 để tham khảo bất kỳ điều nào sau đây:

1. Một phương thức Static

Nếu bạn có một biểu thức lambda mà gọi một phương thức static:

(args) -> Class.staticMethod(args)

Sau đó, bạn có thể biến nó thành một phương thức tham chiếu:

Class::staticMethodName

Ví dụ, nếu bạn đã có một phương thức static PrintMessage trong một lớp MyClass, thì phương thức tham chiếu của bạn sẽ giống như sau:

public class myClass {  
   public static void PrintMessage(){  
       System.out.println("This is a static method");  
   }  
 
}  
   public static void main(String[] args) {  
       Thread thread = new Thread(myClass::PrintMessage);  
       thread.start();       
   }  
}

2. Một phương thức thể hiện của một đối tượng cụ thể

Đây là một phương thức thể hiện của một đối tượng được biết đến trước, cho phép bạn thay thế:

(arguments) -> containingObject.instanceMethodName(arguments)

với

containingObject::instanceMethodName

Vì vậy, nếu bạn đã có biểu thức lambda sau đây:

MyClass.printNames(names, x -> System.out.println(x));

Sau đó giới thiệu một phương thức tham chiếu sẽ cung cấp cho bạn code sau:

MyClass.printNames(names,System.out::println);

3. Một phương pháp thể hiện của một đối tượng tùy ý của một loại đặc biệt

Đây là một phương thức dụ của một đối tượng tùy ý sẽ được cung cấp sau đó và được viết theo định dạng sau:

ContainingType::methodName

4. Tham chiếu khởi tạo

Tham chiếu khởi tạo tương tự như các tham chiếu phương thức, ngoại trừ việc bạn sử dụng từ khóa new để gọi constructor. Ví dụ, Button :: new là một tham chiếu khởi tạo cho lớp Button, mặc dù constructor chính xác được invoked phụ thuộc vào context.

Sử dụng tham chiếu khởi tạo, bạn có thể chuyển :

(arguments) -> new ClassName(arguments)

thành

ClassName::new

Ví dụ, nếu bạn có interface MyInterface :

public Interface myInterface{
  public abstract Student getStudent(String name, Integer age);
}

Bạn có thể sử dụng tham chiếu khởi tạo để tạo mới một đối tượng Student :

myInterface stu1 = Student::new;
Student stu = stu1.getStudent("John Doe", 27);

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí