Học Java 8

Học Java 8 – Functional Interface là gì?

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ểuTham sốGiá trị trả về
PredicateChỉ có 1 tham sốTrả về giá trị true hoặc false của biểu thức
FunctionChỉ có 1 tham sốGiá trị trả về có thể thuộc bất kỳ kiểu dữ liệu nào
ConsumerChỉ có 1 tham sốKhông trả về
SupplierKhô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{
}

KHÓA HỌC LẬP TRÌNH CHO NGƯỜI MỚI BẮT ĐẦU TRONG 6 THÁNG!


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Bài viết liên quan

Leave a Reply

Your email address will not be published.

TÀI LIỆU DEV WORLD
Cẩm nang phát triển bền vững với nghề lập trình!