JavaRush /Blog Java /Random-VI /Giới thiệu về giao diện chức năng
minuteman
Mức độ

Giới thiệu về giao diện chức năng

Xuất bản trong nhóm
Các bạn đừng troll nhiều nhé, mình mới bắt đầu dịch bài thôi Giới thiệu về Giao diện chức năng - 1

Giới thiệu về Giao diện chức năng - Các khái niệm được tái tạo trong Java 8

Mọi nhà phát triển Java trên thế giới đều đã từng sử dụng một trong các giao diện sau ít nhất một lần: java.lang.Runnable, java.awt.event.ActionListener, java.util.Comparator, java.util.concurrent.Callable. Họ đều có một điểm chung, đó là họ đều chỉ có một phương pháp. Có nhiều giao diện khác như vậy trong JDK, cũng như các giao diện khác được tạo bởi các nhà phát triển Java. Các giao diện này còn được gọi là Single Abstract Method interfaces(giao diện SAM). Một trong những cách phổ biến nhất để sử dụng các giao diện này là tạo các lớp bên trong ẩn danh sử dụng các giao diện này, như trong ví dụ sau:
public class AnonymousInnerClassTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("A thread created and running...");
            }
        }).start();
    }
}
Trong Java 8, khái niệm SAM được tái tạo và gọi là các giao diện chức năng. Chúng có thể được biểu diễn bằng biểu thức lambda, tham chiếu phương thức và hàm tạo tham chiếu. Một chú thích @FunctionalInterface mới đã được tạo, chú thích này được sử dụng để đưa ra lỗi ở cấp trình biên dịch khi giao diện bạn chú thích không hoạt động ở cấp chức năng. Hãy xem xét một giao diện chức năng đơn giản với một phương thức trừu tượng:
@FunctionalInterface
public interface SimpleFunInterface {
    public void doWork();
}
Một giao diện cũng có thể khai báo các phương thức trừu tượng từ một lớp java.lang.Object, nhưng trong trường hợp này, giao diện cũng có thể được khai báo theo chức năng:
@FunctionalInterface
public interface SimpleFuncInterface {
    public void doWork();
    public String toString();
    public Boolean equals(Object o);
}
Ngay sau khi bạn thêm một phương thức trừu tượng khác vào giao diện, IDE sẽ đánh dấu nó là sai như trong hình: Giới thiệu về Giao diện chức năng - 2 Một giao diện có thể kế thừa từ một giao diện khác; nếu giao diện kế thừa từ một giao diện chức năng và không chứa các phương thức trừu tượng mới thì giao diện này cũng có chức năng. Nhưng một giao diện chỉ có thể chứa một phương thức trừu tượng và nhiều phương thức mặc định và nó vẫn được coi là có chức năng.
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
    default public void doSomeWork() {
        System.out.println("Doing some work in interface impl...");
    }
    default public void doSomeWork() {
        System.out.println("Doing some other work in interface impl...");
    }
}
Ví dụ hàng đầu vẫn là một giao diện chức năng. Bây giờ hãy xem cách chúng ta có thể sử dụng biểu thức lambda để thay thế một lớp bên trong ẩn danh nhằm triển khai các giao diện chức năng:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
    public static void main(String[] args) {
        carryOutWork(new SimpleFunInterface() {
            @Override
            public void doWork() {
                System.out.println("Do work in SimpleFun impl...");
            }
        });
        carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
    }
    public static void carryOutWork(SimpleFuncInterface sfi) {
        sfi.work();
    }
}
Kết quả của chương trình sẽ như sau:
Do work in SimpleFun impl...
Do work in lambda exp impl...
Trong trường hợp bạn đang sử dụng IDE hỗ trợ cú pháp biểu thức lambda Java (Bản dựng Netbeans 8 hàng đêm) – Bạn sẽ nhận được gợi ý khi sử dụng các lớp bên trong ẩn danh: Giới thiệu về Giao diện chức năng - 3 Đây là phần giới thiệu ngắn gọn về khái niệm giao diện chức năng trong Java 8 và cách chúng có thể được triển khai sử dụng biểu thức lambda.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION