Est-ce même possible?
java
anonymous-function
Aarona
la source
la source
Réponses:
si vous parlez d'une fonction anonyme et que vous utilisez une version de Java antérieure à Java 8, alors en un mot, non. ( En savoir plus sur les expressions lambda si vous utilisez Java 8+ )
Cependant, vous pouvez implémenter une interface avec une fonction comme celle-ci:
et vous pouvez l'utiliser avec des classes internes pour obtenir une fonction presque anonyme :)
la source
Voici un exemple de classe interne anonyme.
Ce n'est pas très utile en l'état, mais cela montre comment créer une instance d'une classe interne anonyme
extends Object
et@Override
satoString()
méthode.Voir également
Les classes internes anonymes sont très pratiques lorsque vous avez besoin d'implémenter une
interface
classe qui n'est peut-être pas hautement réutilisable (et ne vaut donc pas la peine d'être refactorisée en sa propre classe nommée). Un exemple instructif est l'utilisation d'une coutumejava.util.Comparator<T>
pour le tri.Voici un exemple de la façon dont vous pouvez trier un en
String[]
fonction deString.length()
.Notez l'astuce de comparaison par soustraction utilisée ici. Il faut dire que cette technique est en général cassée: elle n'est applicable que lorsque l'on peut garantir qu'elle ne débordera pas (c'est le cas des
String
longueurs).Voir également
la source
EventListener
(sous) implémentations dans l'application Swing moyenne.Linked
barre latérale, donc je fais de mon mieux pour l'utiliser.Avec l'introduction de l'expression lambda dans Java 8, vous pouvez désormais avoir des méthodes anonymes.
Disons que j'ai une classe
Alpha
et que je veux filtrer lesAlpha
s sur une condition spécifique. Pour ce faire, vous pouvez utiliser un fichierPredicate<Alpha>
. Il s'agit d'une interface fonctionnelle qui a une méthodetest
qui accepte unAlpha
et retourne unboolean
.En supposant que la méthode de filtrage a cette signature:
Avec l'ancienne solution de classe anonyme, vous auriez besoin de quelque chose comme:
Avec les lambdas Java 8, vous pouvez faire:
Pour plus d'informations, consultez le didacticiel sur les expressions Lambda
la source
Des classes internes anonymes implémentant ou étendant l'interface d'un type existant ont été faites dans d'autres réponses, bien qu'il soit intéressant de noter que plusieurs méthodes peuvent être implémentées (souvent avec des événements de style JavaBean, par exemple).
Une caractéristique peu reconnue est que bien que les classes internes anonymes n'aient pas de nom, elles ont un type. De nouvelles méthodes peuvent être ajoutées à l'interface. Ces méthodes ne peuvent être invoquées que dans des cas limités. Principalement directement sur l'
new
expression elle-même et au sein de la classe (y compris les initialiseurs d'instance). Cela peut dérouter les débutants, mais cela peut être "intéressant" pour la récursivité.(J'ai initialement écrit ceci en utilisant
node
plutôt quecur
dans laprint
méthode. Dites NON à la capture "implicitementfinal
" des locaux? )la source
node
doit être déclaréfinal
ici.cur
."Node" +
pour rendre une deuxième méthode nécessaire). / Je n'ai pas de nom. Peut-être pourrais-je créer une question de dénomination «sondage» (CW), et la faire rejeter dans l'oubli.Oui si vous utilisez le dernier java qui est la version 8. Java8 permet de définir des fonctions anonymes, ce qui était impossible dans les versions précédentes.
Prenons l'exemple de la documentation java pour savoir comment déclarer des fonctions et des classes anonymes
Syntaxe des classes anonymes
Considérez l'instanciation de l'objet frenchGreeting:
L'expression de classe anonyme comprend les éléments suivants:
new
opérateurLe nom d'une interface à implémenter ou d'une classe à étendre. Dans cet exemple, la classe anonyme implémente l'interface HelloWorld.
Parenthèses contenant les arguments d'un constructeur, tout comme une expression de création d'instance de classe normale. Remarque: Lorsque vous implémentez une interface, il n'y a pas de constructeur, vous utilisez donc une paire vide de parenthèses, comme dans cet exemple.
Un corps, qui est un corps de déclaration de classe. Plus précisément, dans le corps, les déclarations de méthode sont autorisées mais les instructions ne le sont pas.
la source