Ist es überhaupt möglich?
java
anonymous-function
aarona
quelle
quelle
Antworten:
Wenn Sie eine anonyme Funktion meinen und eine Version von Java vor Java 8 verwenden, dann in einem Wort, nein. ( Lesen Sie mehr über Lambda-Ausdrücke, wenn Sie Java 8+ verwenden. )
Sie können jedoch eine Schnittstelle mit einer Funktion wie der folgenden implementieren:
und Sie können dies mit inneren Klassen verwenden, um eine fast anonyme Funktion zu erhalten :)
quelle
Hier ist ein Beispiel einer anonymen inneren Klasse.
Dies ist zwar nicht sehr nützlich, zeigt jedoch, wie eine Instanz einer anonymen inneren Klasse
extends Object
und@Override
derentoString()
Methode erstellt wird.Siehe auch
Anonyme innere Klassen sind sehr praktisch, wenn Sie eine implementieren müssen,
interface
die möglicherweise nicht in hohem Maße wiederverwendbar ist (und daher keine Umgestaltung in eine eigene benannte Klasse wert ist). Ein lehrreiches Beispiel ist die Verwendung eines benutzerdefiniertenjava.util.Comparator<T>
Sortiers.Hier ist ein Beispiel, wie Sie eine
String[]
basierend auf sortieren könnenString.length()
.Beachten Sie den hier verwendeten Trick zum Vergleichen durch Subtraktion. Es sollte gesagt werden, dass diese Technik im Allgemeinen nicht funktioniert: Sie ist nur anwendbar, wenn Sie garantieren können, dass sie nicht überläuft (dies ist bei
String
Längen der Fall ).Siehe auch
quelle
EventListener
(Unter-) Implementierungen in der durchschnittlichen Swing-Anwendung gefunden werden.Linked
Seitenleiste hinzugefügt , daher gebe ich mein Bestes, um sie zu nutzen.Mit der Einführung des Lambda-Ausdrucks in Java 8 können Sie jetzt anonyme Methoden verwenden.
Angenommen, ich habe eine Klasse
Alpha
und möchteAlpha
s nach einer bestimmten Bedingung filtern . Dazu können Sie a verwendenPredicate<Alpha>
. Dies ist eine funktionale Schnittstelle mit einer Methodetest
, die a akzeptiertAlpha
und a zurückgibtboolean
.Angenommen, die Filtermethode hat diese Signatur:
Mit der alten anonymen Klassenlösung müssten Sie Folgendes tun:
Mit den Java 8 Lambdas können Sie Folgendes tun:
Weitere Informationen finden Sie im Lambda Expressions-Tutorial
quelle
Anonyme innere Klassen, die die Schnittstelle eines vorhandenen Typs implementieren oder erweitern, wurden in anderen Antworten verwendet, obwohl es erwähnenswert ist, dass mehrere Methoden implementiert werden können (häufig häufig bei Ereignissen im JavaBean-Stil).
Ein wenig erkanntes Merkmal ist, dass anonyme innere Klassen zwar keinen Namen haben, aber einen Typ. Der Schnittstelle können neue Methoden hinzugefügt werden. Diese Methoden können nur in begrenzten Fällen aufgerufen werden. Hauptsächlich direkt auf den
new
Ausdruck selbst und innerhalb der Klasse (einschließlich Instanzinitialisierer). Es mag Anfänger verwirren, aber es kann für die Rekursion "interessant" sein.(Ich habe dies ursprünglich
node
eher mit alscur
mit derprint
Methode geschrieben. Sag NEIN zum Erfassen von "implizitfinal
" Einheimischen? )quelle
node
sollte hier deklariertfinal
werden.cur
."Node" +
, eine zweite Methode erforderlich zu machen). / Ich habe keinen Namen. Vielleicht könnte ich eine Frage mit dem Namen "Umfrage" (CW) erstellen und sie in Vergessenheit geraten lassen.Ja, wenn Sie das neueste Java der Version 8 verwenden. Mit Java8 können anonyme Funktionen definiert werden, die in früheren Versionen nicht möglich waren.
Nehmen wir ein Beispiel aus Java-Dokumenten , um zu erfahren, wie wir anonyme Funktionen und Klassen deklarieren können
Syntax anonymer Klassen
Betrachten Sie die Instanziierung des frenchGreeting-Objekts:
Der anonyme Klassenausdruck besteht aus folgenden Elementen:
new
BetreiberDer Name einer zu implementierenden Schnittstelle oder einer zu erweiternden Klasse. In diesem Beispiel implementiert die anonyme Klasse die Schnittstelle HelloWorld.
Klammern, die die Argumente für einen Konstruktor enthalten, genau wie ein normaler Ausdruck zur Erstellung von Klasseninstanzen. Hinweis: Wenn Sie eine Schnittstelle implementieren, gibt es keinen Konstruktor. Daher verwenden Sie wie in diesem Beispiel ein leeres Klammerpaar.
Ein Body, der ein Klassendeklarationskörper ist. Insbesondere sind im Hauptteil Methodendeklarationen zulässig, Anweisungen jedoch nicht.
quelle