当前位置: 首页 > 知识库问答 >
问题:

Java 8中函数接口的定义[副本]

艾国安
2023-03-14

函数接口定义为恰好有一个显式声明的抽象方法的任何接口。(限定是必要的,因为接口可能具有非抽象的默认方法。)这就是为什么函数接口过去被称为单一抽象方法(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);
        }
    }

共有1个答案

苏麒
2023-03-14

确实,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不能允许以下两个,因为它清楚地区分了这两个:

  • 我提供了一个函数的示例。它需要一种功能,任何一种功能。 如何定义这样一个函数参数而不使用?