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);
由于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 表达式应该可以分配给功能接口
该Comparator
接口有两个抽象方法,它们分别是compare
和equals
并用 注释@FunctionalInterface
。这不违反只有一个抽象方法的功能接口的定义吗?