Trong Java 8, một functional interface là một interface chỉ chứa một phương thức trừu tượng duy nhất. Nó được sử dụng như một cơ chế để hỗ trợ lambda expressions và phương thức tham chiếu (method references). Để khai báo một functional interface, bạn có thể sử dụng annotation @FunctionalInterface
. Annotation này không bắt buộc nhưng giúp compiler kiểm tra và đảm bảo rằng interface của bạn thỏa mãn quy định của functional interface.
Định nghĩa Functional Interface:
@FunctionalInterface
public interface SimpleFunctionalInterface {
void execute();
}
Interface trên có một phương thức trừu tượng duy nhất, và do đó, nó là một functional interface. Bạn có thể sử dụng annotation @FunctionalInterface
để báo cho compiler biết rằng bạn có ý định tạo một functional interface. Nếu bạn thêm một phương thức trừu tượng thứ hai vào interface, compiler sẽ báo lỗi.
Triển khai Functional Interface sử dụng Lambda Expression:
Lambda expressions cung cấp một cách ngắn gọn để triển khai functional interfaces mà không cần phải tạo một lớp ẩn danh.
SimpleFunctionalInterface sfi = () -> System.out.println("Executing...");
sfi.execute();
Trong ví dụ trên, chúng ta triển khai phương thức execute
của SimpleFunctionalInterface
bằng cách sử dụng một lambda expression. Khi gọi sfi.execute()
, code trong lambda expression sẽ được thực thi.
Ví dụ Sử dụng Functional Interface trong API:
Java 8 đã giới thiệu một số functional interfaces sẵn có trong gói java.util.function
, chẳng hạn như Predicate<T>
, Function<T,R>
, Consumer<T>
, và Supplier<T>
.
// Sử dụng Predicate<T> để kiểm tra điều kiện
Predicate<String> stringLengthCheck = (s) -> s.length() < 10;
System.out.println(stringLengthCheck.test("Hello")); // true
// Sử dụng Function<T,R> để chuyển đổi từ T sang R
Function<String, Integer> lengthFunction = s -> s.length();
System.out.println(lengthFunction.apply("Hello")); // 5
// Sử dụng Consumer<T> để tiêu thụ một đối tượng
Consumer<String> stringConsumer = s -> System.out.println(s.toUpperCase());
stringConsumer.accept("hello"); // HELLO
// Sử dụng Supplier<T> để cung cấp các đối tượng T
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println(randomSupplier.get());
Functional interfaces là một phần quan trọng của lập trình hàm trong Java, cung cấp một cách linh hoạt và mạnh mẽ để xử lý các thao tác trên dữ liệu, đặc biệt khi kết hợp với Stream API và lambda expressions.
Comments