2016-05-31 4 views
2

Ich brauche eine Instanz, die eine bestimmte Schnittstelle implementiertOne-Liner Klasseninstanz Implementierung

Ist es möglich, eine einlinige Klasseninstanz Implementierung zu erstellen?

+3

, die auf dem hängt Schnittstelle (ist es eine funktionale Schnittstelle?) und ihre erforderliche Implementierung. – Eran

+4

Es kommt auch darauf an, wie lang die Leitung ist :-) –

+2

Ja. Wie schrecklich eine Zeile aussieht, hängt von der Komplexität der Schnittstelle ab. – khelwood

Antwort

6

In Java 8, wenn die Schnittstelle eine funktionale Schnittstelle ist (genau eine abstrakte Methode, siehe unten), können Sie es über einen Lambda-Ausdruck oder in einfachen Fällen über eine Methode Referenz definieren:

Lambda:

Runnable runnable =() -> System.out.println("I am a runnable"); 

Methode Referenz:

Predicate<Character> uppercase = Character::isUpperCase; 

Hinweis: funktionale Schnittstellen müssen nämlich kommentierten nicht werden h @FunctionalInterface, aber es ist ein Fehler bei der Kompilierung, eine Schnittstelle als @FunctionalInterface zu kommentieren, wenn sie nicht genau eine abstrakte Methode hat (also die Annotation in ähnlicher Weise nützlich ist) zu @Override).

See:


aktualisieren Beantwortung auf Bemerkungen:

Ja, können Sie definieren und eine Lambda mit einem Einzeiler verwenden, aber das erfordert eine explizite Umwandlung, wenn der Kontext nicht klar ist:

// cast required 
System.out.println(((Predicate<Character>) Character::isUpperCase).test('A')); 

// no cast required 
Arrays.asList("foo","bar").forEach(System.out::println); 
Arrays.asList(1,2).forEach(i -> System.out.println(i*2)); 
+0

nur neugierig, kann die Rückkehr dieser Instanz in einer Zeile zurückgegeben werden? –

+3

Es ist besser, nur zu sagen, dass eine funktionale Schnittstelle eine ** abstrakte ** -Methode hat, da Sie dadurch nicht die verschiedenen Typen irrelevanter Methoden berücksichtigen müssen, da es nicht nur 'Standard'-Methoden, sondern auch' statische' Methoden gibt , und Java 9 erlaubt 'private' Methoden, die alle für die Frage irrelevant sind, ob eine' Schnittstelle' eine funktionale Schnittstelle ist. Um es genauer zu sagen, es gibt genau eine abstrakte Methode, die nicht mit einer Methode übereinstimmt, die in 'java.lang.Object' deklariert wurde. Daher ist' Comparator' mit zwei abstrakten Methoden immer noch eine funktionale Schnittstelle. – Holger

+1

@fireflieslive: Es ist nicht klar, was "kann die Rückkehr dieser Instanz in einer Zeile zurückgegeben werden" soll bedeuten. – Holger

0

Manchmal ist es möglich. Zum Beispiel:

List<T> list = ... 
Collections.sort(list, (t1, t2) -> compareOperation(t1,t2)); 

functional interface Comparator<T> A ist eine Schnittstelle, die nur eine abstrakte Methode enthält. See docs.oracle

Verwandte Themen