Java 中的函數式介面是僅包含 1 個抽象方法的介面。主要目的是在 lambda 表達式和方法引用中使用它。
存在 1 個抽象方法是唯一的條件,因此函數式介面也可以包含
我不會詳細討論它們。我注意到最常用的是: Consumer<T>、Function<T,R>、Predicate<T>、Supplier<T>、UnaryOperator<T>及其Bi形式。更多詳細資訊可以在文件頁面上找到:Package java.util.function
default
方法static
。您可以將@FunctionalInterface註解新增至函數式介面。這不是必需的,但如果存在此註釋,且抽象方法多於或少於 1 個,則程式碼將無法編譯。建議添加@FunctionalInterface。這將允許您在 lambda 表達式中使用接口,而不必擔心有人向接口添加新的抽象方法並且接口將不再起作用。Java 具有內建的函數接口,位於java.util.function
.
還有什麼要讀的: |
---|
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
}
}
但事實證明,Java 語言規範中描述了一個微妙的點:“介面不是繼承自 Object,而是隱式聲明了許多與 Object 相同的方法。” 這意味著函數式介面還可以包含類別中定義的抽象方法Object
。下面的程式碼是有效的,不會有編譯或執行時錯誤:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// другие default or static методы
}
面試的時候要小心!祝你好運!
GO TO FULL VERSION