在Java 8中,功能接口的定义如下:
函数式接口被定义为任何具有恰好一个显式声明的抽象方法的接口。(这个限定是必要的,因为接口可能具有非抽象默认方法。)这就是为什么功能接口曾被称为单抽象方法 (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);
}
}
lambda表达式表示:
Lambda表达式应该可分配给函数接口
Comparator
接口有两个抽象方法,即compare
和equals
,并且带有@FunctionalInterface
注释。这是否违反了仅具有一个抽象方法的函数接口的定义?
Object
并具有隐式方法Object::toString
、Object::equals
和Object::hashCode
。因此,Comparator<T>
是一个带有 SAM 的接口,它重写了隐式方法。 - Flown