NỘI DUNG BÀI VIẾT
Java 8 là một trong những phiên bản ổn định, được đông đảo lập trình viên sử dụng. Và phiên bản này cũng giống như một cuộc cách mạng của Java cho nền tảng phát triển phần mềm với nhiều sự thay đổi khác nhau như có thêm một số các tính năng mới: Lambda Expression, Stream API, Date Time API, Optional, Functional Interface,… Và hôm nay mình sẽ giới thiệu tới mọi người một tính năng mới đó là Functional Interface – một trong những kiến thức mới khá hay ho, nên tìm hiểu để học Java 8.
Học Java 8 – Tổng quan về Functional Interface
Functional Interface là gì?
Functional Interface chúng ta có thể hiểu đó là những Interface mà chỉ có một phương thức trừu tượng hay nó còn được gọi là Single Abstract Method. Và các bạn cũng có thể đã sử dụng hay bắt gặp một số Functional Interface có sẵn khi làm các bài tập hay đọc các tài liệu trên mạng như là: Runnable, Comparable, Comparator,…
Vậy tại sao chúng ta nên sử dụng Functional Interface?
Functional Interface giúp cho chúng ta – những lập trình viên Java có thể sử dụng biểu thức Lambda Expression để tạo ra instance của interface đó.
Ngoài ra trong phiên bản Java 8, họ cũng đã cung cấp thêm cho các lập trình viên Java một annoutation là @FunctionalInterface. Annoutation này có tác dụng để bắt các lỗi liên quan đến việc khi Interface đang được khai báo là Functional Interface có nhiều hơn 1 phương thức, và nó sẽ bắt lỗi tại thời điểm complier.
Những Functional Interface có sẵn trong Java
Java cung cấp cho chúng ta khá nhiều các Functional Interface được định nghĩa trước để xử lý Functional(Functional Programming) bằng cách sử dụng Lambda Expression. Và khi học Java 8 chúng ta cùng nên biết một số Functional Interface được Java cung cấp sẵn như là:
- Consumer
- Function
- Predicate
- Supplier
Kiểu | Tham số | Giá trị trả về |
Predicate | Chỉ có 1 tham số | Trả về giá trị true hoặc false của biểu thức |
Function | Chỉ có 1 tham số | Giá trị trả về có thể thuộc bất kỳ kiểu dữ liệu nào |
Consumer | Chỉ có 1 tham số | Không trả về |
Supplier | Không có tham số | Giá trị trả về có thể thuộc bất kỳ kiểu dữ liệu nào |
Một số quy tắc khi khai báo Functional Interface
Khi chúng ta khai báo các Functional Interface trong Java 8 cần phải lưu ý những điều sau:
Functional Interface chỉ có duy nhất một phương thức Abstract
Khi khai báo một Functional Interface các bạn cần lưu ý là nó chỉ có duy nhất một phương thức Abstract. Nếu chúng ta khai báo nhiều hơn 1 phương thức Abstract chương trình sẽ xảy ra lỗi tại thời điểm complier và nếu không có phương thức Abstract nào chương trình cũng sẽ báo lỗi.
- Trường hợp lỗi xảy ra khi không có phương thức Abstract
@FunctionalInterface //báo lỗi không có phương thức abstract
public interface MyFunctionalInterface {
}
- Trường hợp lỗi xảy ra khi có nhiều hơn 1 phương thức Abstract
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething1();
void doSomething2();
}
- Truờng hợp khai báo đúng khi chỉ có 1 phương thức Abstract
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething();
}
Functional Interface có thể chứa phương thức có sẵn của lớp Object
Khi khai báo một Functional Interface mọi người cũng có thể khai báo cho nó các phương thức có sẵn của lớp Object. Tuy nhiên khi khai báo các phương thức của lớp Object các bạn vẫn cần phải khai báo cho nó một phương thức Abstract nhé. Vì nó chỉ khai báo những phương thức của lớp Object chứ chưa có phương thức Abstract của riêng nó.
- Trường hợp khai báo lỗi khi thiếu phương thức Abstract:
@FunctionalInterface
public interface MyFunctionalInterface {
String toString();
boolean equals(Object o);
}
- Trường hợp khai báo đúng khi có 1 phương thức Abstract và các phương thức của Object:
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething();
String toString();
boolean equals(Object o);
}
Functional Interface có thể chứa được các phương thức static và default
Khi khai báo Functional Interface các bạn ngoài việc chỉ có thể khai báo duy nhất 1 phương thức Abstract thì cũng có thể khai báo thêm các phương thức Static và Default trong nó mà không xảy ra lỗi.
@FunctionalInterface
public interface MyFunctionalInterface {
static void staticMethod() {
}
void doSomething();
default void defaultMethod() {
}
}
Functional Interface chỉ kế thừa được Interface khác khi nó không có phương thức Abstract
Để Functional Interface các bạn khai báo ra có thể kế thừa được Interface khác thì Interface được kế thừa chỉ được phép có 1 phương thức Abstract và Functional Interface của chúng ta không được có phương thức Abstract.
- Trường hợp lỗi Interface được kế thừa có nhiều hơn 1 phương thức Abstract:
interface A {
void doA();
void doB();
}
@FunctionalInterface
public interface MyFunctionalInterface extends A{
}
- Trường hợp lỗi Functional Interface có phương thức Abstract
interface A {
void doA();
}
@FunctionalInterface
public interface MyFunctionalInterface extends A{
void doB();
}
- Trường hợp khai báo đúng
interface A {
void doA();
}
@FunctionalInterface
public interface MyFunctionalInterface extends A{
}