JavaRush /Java 博客 /Random-ZH /Java函数式接口
Алексей
第 32 级

Java函数式接口

已在 Random-ZH 群组中发布
Java 中的函数式接口是仅包含 1 个抽象方法的接口。主要目的是在 lambda 表达式和方法引用中使用它。
Java 函数式接口 - 1
存在 1 个抽象方法是唯一的条件,因此函数式接口也可以包含default方法static。您可以将@FunctionalInterface注释添加到函数式接口。这不是必需的,但如果存在此注释,并且抽象方法多于或少于 1 个,则代码将无法编译。建议添加@FunctionalInterface。这将允许您在 lambda 表达式中使用接口,而不必担心有人向接口添加新的抽象方法并且接口将不再起作用。Java 具有内置的函数接口,位于java.util.function. 我不会详细讨论它们。我注意到最常用的是: Consumer<T>Function<T,R>Predicate<T>Supplier<T>UnaryOperator<T>及其Bi形式。更多详细信息可以在文档页面上找到:Package 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 методы
}
面试的时候要小心!祝你好运!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION