函数接口定义为恰好有一个显式声明的抽象方法的任何接口。(限定是必要的,因为接口可能具有非抽象的默认方法。)这就是为什么函数接口过去被称为单一抽象方法(SAM)接口的原因,这个术语现在仍然有时会出现。
那么我们为什么会有这个:
List<Double> temperature =
new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);
因为list
中的sort
方法是:
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
确实,comparator
接口有2个抽象方法。但其中一个是equals
,它重写了Object
类中定义的equals
方法,该方法不计。
从@functionalinterface
:
如果接口声明了一个覆盖java.lang.Object
的公共方法之一的抽象方法,那么这也不会计入接口的抽象方法计数,因为接口的任何实现都将有一个来自java.lang.Object
或其他地方的实现。
主要内容:1 Java8 函数式接口的介绍,2 Java8 函数式接口的案例1,3 Java8 函数式接口的案例2,4 Java8 函数式接口的错误示范,5 Java8 函数式接口的案例3,6 Java8 预定义函数式接口1 Java8 函数式接口的介绍 完全包含一种抽象方法的接口称为函数式接口。函数式接口可以具有任意数量的默认静态方法,但只能包含一个抽象方法。函数式接口还可以声明对象类的方法。 函数式接口也称为单一抽象方法接口或SAM接口。它是Java8 中的新功能,有助于实现函数编程方法。
更准确地说,函数接口定义为具有一个抽象方法的任何接口。 然后他继续介绍示例,其中一个是接口: 我能够测试是否可以使用lambda函数代替比较器参数,并且它能够工作(例如)。
更准确地说,函数接口被定义为恰好具有一个抽象方法的任何接口。 然后,他继续举例,其中一个是接口: 我能够测试我可以使用lambda函数来代替比较器参数,并且它可以工作(即)。 但是在比较器接口中,和方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义要求接口只有一个抽象方法,那么这怎么能起作用呢?我错过了什么?
(这里的问题和我问的不一样,是问为什么我们在使用lambda表达式的同时需要函数接口,我的问题是:除了使用lambda表达式之外,函数接口还有哪些其他用途?)
现在使用Lambda表达式,为什么Java不能允许以下两个,因为它清楚地区分了这两个:
我提供了一个函数的示例。它需要一种功能,任何一种功能。 如何定义这样一个函数参数而不使用?