Giao diện chức năng trong Java là giao diện chỉ chứa 1 phương thức trừu tượng. Mục đích chính là sử dụng nó trong các biểu thức lambda và tham chiếu phương thức.
Sự hiện diện của 1 phương thức trừu tượng là điều kiện duy nhất, vì vậy một giao diện chức năng cũng có thể chứa
Tôi sẽ không tập trung vào chúng một cách chi tiết. Tôi lưu ý rằng được sử dụng thường xuyên nhất là: Consumer<T> , Function<T,R> , Predicate<T> , Nhà cung cấp<T> , UnaryOperator<T> và các dạng Bi của chúng . Bạn có thể tìm thêm thông tin chi tiết trên trang tài liệu: Gói java.util.function
default
các phương thức static
. Bạn có thể thêm chú thích @FunctionalInterface vào giao diện chức năng. Điều này là không bắt buộc, nhưng nếu có chú thích này, mã sẽ không biên dịch nếu có nhiều hơn hoặc ít hơn 1 phương thức trừu tượng. Nên thêm @FunctionalInterface. Điều này sẽ cho phép bạn sử dụng giao diện trong biểu thức lambda mà không phải lo lắng rằng ai đó sẽ thêm một phương thức trừu tượng mới vào giao diện và nó sẽ ngừng hoạt động. Java có các giao diện chức năng tích hợp sẵn trong java.util.function
.
Còn gì để đọc: |
---|
import java.util.function.Predicate;
//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
boolean test(Integer value);
}
public class Tester {
public static void main(String[] args) throws Exception {
MyPredicate myPredicate = x -> x > 0;
System.out.println(myPredicate.test(10)); //true
//Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(-10)); //false
}
}
Nhưng hóa ra có một điểm tinh tế được mô tả trong Đặc tả ngôn ngữ Java: “các giao diện không kế thừa từ Object, mà ngầm khai báo nhiều phương thức giống như Object”. Điều này có nghĩa là các giao diện chức năng có thể chứa thêm các phương thức trừu tượng được định nghĩa trong lớp Object
. Mã bên dưới là hợp lệ, sẽ không có lỗi biên dịch hoặc thời gian chạy:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
Hãy cẩn thận khi phỏng vấn! Chúc may mắn!
GO TO FULL VERSION