【发布时间】:2016-04-25 15:06:25
【问题描述】:
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 注释。这不违反只有一个抽象方法的功能接口的定义吗?
【问题讨论】:
-
Java 中的每个类都继承自
Object,并具有隐式方法Object::toString、Object::equals、Object::hashCode。因此Comparator<T>是一个带有 SAM 的接口,它覆盖了隐式方法。 -
你从哪里得到这个定义的?
-
我在很多博客中阅读了我上面分享的定义。而且根据 stackoverflow 的指导方针,我不能分享到其他博客的链接..
标签: java java-8 functional-interface