Java 8中功能接口的定义

时间:2016-04-25 15:06:26

标签: java java-8 functional-interface

Java 8中功能接口的定义说:

  

功能界面定义为完全的任何界面   一个显式声明的抽象方法。 (资格是   必要的,因为接口可能有非抽象的默认方法。)   这就是为什么功能接口曾被称为Single Abstract   方法(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);

由于sort中的List方法是:

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);
        }
    }

lambda表达式说:

  

Lambda Expression应该可以分配给功能接口

Comparator接口有两个抽象方法,compareequals,并使用@FunctionalInterface进行注释。这是否违反了只有一种抽象方法的功能界面的定义?

1 个答案:

答案 0 :(得分:14)

Comparator接口确实有2个抽象方法。但其中一个是equals,它会覆盖equals类中定义的Object方法,而且此方法不算数。

来自@FunctionalInterface

  

如果一个接口声明一个覆盖java.lang.Object的公共方法之一的抽象方法,那么也会计入接口的抽象方法计数,因为它的任何实现都是接口将具有java.lang.Object或其他地方的实现。

因此,这使得Comparator接口成为功能方法为compare(o1, o2)的功能接口。

lambda表达式(a, b) -> a > b ? -1 : 1符合该合同:它声明了2个参数并返回int