Trong những bài viết về Lambda Expression, mình đã giới thiệu với các bạn sơ qua về Functional Interface và tầm quan trọng của nó khi sử dụng Lambda Expression trong Java code. Trong bài viết này, mình sẽ nói chi tiết về Functional Interface hơn các bạn nhé!
Định nghĩa Functional Interface
OK, đầu tiên mình xin nói về định nghĩa của Functional Interface một cách đầy đủ và chi tiết nhất.
- Đầu tiên, chắc chắn rồi, Functional Interface phải là một interface.
Ví dụ:
1 2 3 4 |
package com.huongdanjava; public interface SayHello { } |
- Thứ hai là nó chỉ có một và duy nhất một phương thức abstract. Lambda Expression sẽ là người implement phương thức abstract này.
Ví dụ, phương thức say() của interface sau là một phương thức abstract như thế:
1 2 3 4 5 |
package com.huongdanjava; public interface SayHello { void say(String name); } |
- Cái thứ ba, không bắt buộc nhưng các bạn nên biết là: chúng ta có thể sử dụng annotation @FunctionalInterface để đánh dấu class mà chúng ta muốn là một Functional Interface.
Ví dụ:
1 2 3 4 5 6 |
package com.huongdanjava; @FunctionalInterface public interface SayHello { void say(); } |
Sau khi một interface được đánh dấu với annotation trên, các bạn không thể thêm mới một phương thức abstract khác. Nếu cố tình thì sẽ gặp lỗi compile ngay.
Một số Functional Interface trong Java
Từ Java 7 trở về trước, chúng ta có một số interface có thể coi chúng là những Functional Interface từ Java 8 trở đi, ví dụ như:
- FileFilter với chỉ một phương thức abstract:
1 |
boolean accept(File pathname); |
- ActionListener cũng với chỉ một phương thức abstract:
1 |
public void actionPerformed(ActionEvent e); |
Từ Java 8 trở đi, Java cung cấp cho chúng ta thêm nhiều Functional Interface khác. Chúng được định nghĩa trong package java.util.function:
Các bạn có thể tìm hiểu thêm về chúng tại đây. Sau này, mình sẽ có những bài viết về các Functional Interface nằm trong package này. Các bạn theo dõi Hướng Dẫn Java để cập nhập nhé!
VuMinh
Em vẫn chưa hiểu vì sao tạo 1 interface chỉ có 1 abstract method, tại sao ko tạo nhiều mà dùng hả anh?
Khanh Nguyen
Nếu nhiều abstract method thì khi hiện thực Functional Interface với Lambda Expression, Java đâu biết phương thức abstract nào sẽ cần hiện thực đâu em.
em
Noi tom lai la no la mot interface va chi co mot phuong thuc phai ko a
Khanh Nguyen
Chỉ có một phương thức abstract thì đúng hơn em!