En parlant de Java 8, la première chose qui me vient à l'esprit est lambda (fermeture) et la méthode d'extension virtuelle (méthode par défaut). Cette fonctionnalité a longtemps été mise en avant par les principaux sites Web technologiques, et c'est également la première fonctionnalité dont nous parlerons lors de la conférence. Au début de notre série Java 8 (JEP126 http://openjdk.java.net/jeps/126), certaines bibliothèques de jdk8 ont été repensées à l'aide d'expressions lambda. Comprendre cela est d'une grande importance pour apprendre les nouvelles fonctionnalités de Java 8.
1.Interface fonctionnelle
Interface fonctionnelle (l'interface fonctionnelle est aussi appelée interface fonctionnelle, mais c'est en fait la même chose). En termes simples, une interface fonctionnelle est une interface qui ne contient qu'une seule méthode. Par exemple, java.lang.Runnable et java.util.Comparator dans la bibliothèque standard Java sont des interfaces fonctionnelles typiques. Java 8 fournit @FunctionalInterface comme annotation. Cette annotation n'est pas nécessaire tant que l'interface répond aux normes des interfaces fonctionnelles (c'est-à-dire une interface qui ne contient qu'une seule méthode), la machine virtuelle la déterminera automatiquement. Il est préférable d'utiliser l'annotation @FunctionalInterface sur l'interface pour la déclarer. Cela empêche d'autres personnes de l'équipe d'ajouter par erreur de nouvelles méthodes à l'interface.
Lambda en Java ne peut pas apparaître seul. Il nécessite une interface fonctionnelle pour le contenir. Le corps de la méthode d'expression lambda est en fait l'implémentation de l'interface fonctionnelle.
2. Syntaxe Lambda
Contient trois parties
1. Un paramètre formel séparé par des virgules entre parenthèses. Le paramètre est le paramètre de la méthode dans l'interface fonctionnelle.
2. Un symbole de flèche : ->
3. Le corps de la méthode peut être une expression ou un bloc de code. Le corps de la méthode est l'implémentation de la méthode dans l'interface fonctionnelle, il doit être enveloppé avec {} et une valeur de retour est requise, mais. il y a une exception. Si Si la valeur de retour de la méthode dans une interface fonctionnelle est nulle, {} n'est pas nécessaire.
Globalement, cela ressemble à ceci :
Copiez le code comme suit :
(paramètres) -> expression ou (paramètres) -> { instructions }
Voir un exemple complet pour une compréhension facile
Copiez le code comme suit :
/**
* Tester l'expression lambda
*
* @auteur benhail
*/
classe publique TestLambda {
public static void runThreadUseLambda() {
//Runnable est une interface de fonction qui contient uniquement une méthode d'exécution sans paramètre qui renvoie void ;
//Il n'y a donc aucun paramètre sur le côté gauche de l'expression lambda et aucun retour sur le côté droit. Elle imprime simplement une phrase.
new Thread(() ->System.out.println("thread implémenté par lambda")).start();
}
public static void runThreadUseInnerClass() {
//Je ne parlerai pas beaucoup de cette méthode. C'était une approche courante dans les anciennes versions.
nouveau fil (nouveau Runnable() {
@Outrepasser
public void run() {
System.out.println("Thread implémenté par la classe interne");
}
}).commencer();
}
public static void main (String[] arguments) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
On voit que le code conçu à l'aide d'expressions lambda sera plus concis et lisible.
3. Référence de la méthode
En fait, il s'agit d'une manière simplifiée d'écrire une expression lambda. La méthode référencée est en fait l'implémentation du corps de la méthode de l'expression lambda. La syntaxe est également très simple. Le côté gauche est le conteneur (peut être un nom de classe ou un nom d'instance). le milieu est "::", et le côté droit est le nom de la méthode correspondante. Comme indiqué ci-dessous :
Copiez le code comme suit : ObjectReference::methodName
Le format général de citation de la méthode est
S’il s’agit d’une méthode statique, il s’agit de ClassName ::methodName. Tel que Object :: égal
S’il s’agit d’une méthode d’instance, il s’agit de Instance::methodName. Tel que Object obj=new Object();obj::equals;
Constructeur. Il s'agit de ClassName :: new.
Regardons un exemple complet pour une compréhension plus facile :
Copiez le code comme suit :
importer java.awt.FlowLayout ;
importer java.awt.event.ActionEvent ;
importer javax.swing.JButton ;
importer javax.swing.JFrame ;
/**
*
* @auteur benhail
*/
classe publique TestMethodReference {
public static void main (String[] arguments) {
Cadre JFrame = new JFrame();
frame.setLayout(nouveau FlowLayout());
frame.setVisible(true);
JButton bouton1 = new JButton("Cliquez sur moi !");
JButton bouton2 = new JButton("Cliquez-moi aussi!");
frame.getContentPane().add(button1);
frame.getContentPane().add(button2);
//Le paramètre de la méthode addActionListener ici est ActionListener, qui est une interface fonctionnelle
//Utiliser la méthode d'expression lambda
button1.addActionListener(e -> { System.out.println("Voici l'implémentation de Lambda"); });
//Utiliser la méthode de référence de méthode
bouton2.addActionListener(TestMethodReference::doSomething);
}
/**
* Voici la méthode d'implémentation de l'interface fonctionnelle ActionListener
* @param e
*/
public static void doSomething (ActionEvent e) {
System.out.println("Voici l'implémentation de référence de la méthode");
}
}
On peut voir que la méthode doSomething est l'implémentation de l'expression lambda. L'avantage est que si vous pensez que la méthode lambda est très longue et affecte la lisibilité du code, la référence de méthode est une solution.
4. Résumé
Ce qui précède est tout le contenu de la syntaxe des expressions lambda. Je pense que tout le monde a une certaine compréhension des expressions lambda. Cependant, si le code est simple, il n'impressionnera pas beaucoup de téléspectateurs. En fait, l'urgence. besoin d'introduire lambda dans java 8 c'est parce que lambda Les expressions peuvent simplifier le traitement multithread ou multicœur des données sur une collection et fournir une vitesse de traitement de collection plus rapide. Cette fonctionnalité de JEP126 sera divisée en trois parties. .Il y a trop de choses à écrire.Cette partie familiarise les lecteurs avec la syntaxe et les concepts des expressions lambda et des références de méthodes.La deuxième partie concerne le contenu des méthodes d'extension virtuelle (méthodes par défaut). grandes collections de données et solutions. Découvrez la puissance des expressions lambda. Restez à l'écoute. . . .