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