Die Definition einer funktionellen Schnittstelle in Java 8 sagt:Definition von Functional-Schnittstelle in Java 8
Eine funktionale Schnittstelle wie jede Schnittstelle definiert ist, die genau man explizit erklärte abstrakte Methode hat. (Die Qualifizierung ist notwendig, da eine Schnittstelle nicht abstrakte Standardmethoden haben kann.) Aus diesem Grund wurden Funktionsschnittstellen als Single Interfaces bezeichnet, die manchmal noch zu sehen sind.
Wie kommen wir haben dies:
List<Double> temperature =
new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);
Da die sort
Methode in List
ist:
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);
}
}
Und der Lambda-Ausdruck sagt:
Lambda Expression sollte einer funktionalen Schnittstelle zuweisbar sein
Comparator
Die Schnittstelle hat zwei abstrakte Methoden, die compare
und equals
sind und mit @FunctionalInterface
annotiert. Verstößt dies nicht gegen die Definition einer funktionalen Schnittstelle mit nur einer abstrakten Methode?
Jede Klasse in Java erbt von 'Object' und hat die impliziten Methoden' Object :: toString', 'Object :: equals',' Object :: hashCode'. Daher ist 'Comparator 'eine Schnittstelle mit einer SAM, die die implizite Methode überschreibt. –
Flown
Woher hast du diese Definition? – Tunaki
Es gibt viele Blogs, in denen ich die Definition gelesen habe, die ich oben geteilt habe. Und gemäß den Richtlinien von stackoverflow kann ich den Link zu anderen Blogs nicht teilen. –