Maison Java Javacommencer Compréhension approfondie des expressions Lambda et des interfaces fonctionnelles

Compréhension approfondie des expressions Lambda et des interfaces fonctionnelles

Nov 25, 2019 pm 03:44 PM
java java8 lambda 函数式编程

Java8 est considérée comme la version la plus modifiée de l'histoire de Java. Il contient de nombreuses nouvelles fonctionnalités importantes, dont la principale est l'ajout d'expressions Lambda et de l'API Stream. Les deux peuvent également être utilisés ensemble. [Apprentissage recommandé : Tutoriel vidéo Java]

Compréhension approfondie des expressions Lambda et des interfaces fonctionnelles

Regardons d'abord qu'est-ce qu'une expression Lambda.

Expression Lambda, l'explication sur Wikipédia est un opérateur utilisé pour représenter des fonctions anonymes et des fermetures. J'ai toujours l'impression que c'est très abstrait après avoir vu cette explication

public class SwingTest {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("My JFrame");
        JButton jButton = new JButton("My JButton");

        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {                
                System.out.println("Button Pressed!");
            } 
        }); 
        
        jFrame.add(jButton); jFrame.pack(); 
        jFrame.setVisible(true); 
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }
}
Copier après la connexion
<.>Il s'agit d'un code dans la programmation Swing qui lie un événement d'écoute à Button. Lorsque vous cliquez sur le bouton, "Button Pressed!" sera affiché sur la console. Ici, une instance d'une classe interne anonyme est créée pour se lier à l'auditeur, ce qui était également une forme d'organisation de code plus conventionnelle dans le passé. Mais si nous y regardons de plus près, nous constaterons qu'en fait, ce sur quoi nous nous concentrons réellement est un paramètre de type ActionEvent e et l'instruction System.out.println("Button Pressed!");

Si vous remplacez le code qui crée une instance d'interface à l'aide d'une classe interne anonyme dans le programme précédent par une expression Lambda, le code est le suivant
classe publique SwingTest {

public static void main(String[] args) {
    JFrame jFrame = new JFrame("My JFrame");
    JButton jButton = new JButton("My JButton");

    jButton.addActionListener(e -> System.out.println("Button Pressed!"));

    jFrame.add(jButton);
    jFrame.pack();
    jFrame.setVisible(true);
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Copier après la connexion
}

Focus sur la partie médiane Le changement de code peut être implémenté sur une seule ligne à partir des 6 lignes de code d'origine. Il s'agit d'une forme simple d'expression Lambda.
On peut voir que la syntaxe de l'expression Lambda est
(param1,param2,param3) -> {

//todo
Copier après la connexion
>

Le programme de type des paramètres ici peut être déduit en fonction sur le contexte, mais ce n'est pas le cas. Tous les types ne peuvent pas être déduits. À ce stade, nous devons déclarer explicitement le type du paramètre. Lorsqu'il n'y a qu'un seul paramètre, les parenthèses peuvent être omises. Lorsque la section todo ne contient qu’une seule ligne de code, les accolades extérieures peuvent être omises. Comme notre exemple ci-dessus

En plus du code concis, l'expression Lambda nous a-t-elle apporté des changements ?

Rappelons qu'en Java, on ne peut pas passer une fonction en paramètre à une méthode, ni déclarer que la valeur de retour est une méthode d'une fonction. Avant Java8, la réponse était oui.

Ainsi, dans l'exemple ci-dessus, nous pouvons réellement transmettre un morceau de code logique en tant que paramètre à l'auditeur, indiquant à l'auditeur que vous pouvez le faire lorsque l'événement est déclenché, au lieu d'utiliser une classe interne anonyme. comme paramètre. C'est aussi une autre nouveauté apportée par Java8 : la programmation fonctionnelle.

Il existe de nombreux langages qui prennent en charge la programmation fonctionnelle. En JavaScript, il est très courant de passer une fonction en paramètre ou la valeur de retour est une fonction. JavaScript est un langage fonctionnel très courant.

Lambda ajoute des fonctionnalités de programmation fonctionnelle manquantes à Java, nous permettant de traiter les fonctions comme des citoyens de première classe.

Dans les langages de programmation fonctionnels, le type d'expression Lambda est une fonction.

En Java, les expressions Lambda sont des objets, et elles doivent être attachées à un type d'objet spécial - Functional Interface (Functional Interface) .

Regardons ensuite la définition de l'interface fonctionnelle :

S'il y a une et une seule méthode abstraite dans une interface (les méthodes de la classe Object ne sont pas incluses), alors cette interface Elle peut être considérée comme une interface fonctionnelle.

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
Copier après la connexion
Jetons un coup d'œil à la déclaration de l'interface Runnable. Après Java 8, l'interface Runnable a une annotation FunctionalInterface supplémentaire, indiquant que l'interface est une interface fonctionnelle. Mais si nous n'ajoutons pas l'annotation FunctionalInterface, s'il y a et n'y a qu'une seule méthode abstraite dans l'interface, le compilateur traitera l'interface comme une interface fonctionnelle.

@FunctionalInterface
public interface MyInterface {
    void test();
    String toString();
}
Copier après la connexion
MyInterface C'est également une interface fonctionnelle, car toString() est une méthode de la classe Object. Elle est simplement remplacée ici et n'augmentera pas le nombre de méthodes abstraites dans l'interface.

(Une mention supplémentaire ici est que dans Java 8, les méthodes de l'interface peuvent non seulement avoir des méthodes abstraites, mais peuvent également avoir des méthodes concrètes implémentées, qui sont appelées méthodes par défaut. Cette partie sera présentée en détail plus tard. )
Puisqu'en Java, les expressions Lambda sont des objets. Alors quel est le type de cet objet ? Revoyons à nouveau le programme SwingTest. Ici, une instance d'interface ActionListener est créée sous la forme d'une classe interne anonyme

jButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                
        System.out.println("Button Pressed!");
    } 
});
Copier après la connexion
Améliorée à l'aide d'expressions Lambda

jButton.addActionListener(e -> System.out.println("Button Pressed!"));
Copier après la connexion
Autrement dit, nous utilisons des expressions Lambda pour créer an Un exemple de l'interface ActionListener. Regardons la définition de l'interface ActionListener.

public interface ActionListener extends EventListener {
    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);
}
Copier après la connexion
n'a qu'une seule méthode abstraite Bien que l'annotation FunctionalInterface ne soit pas ajoutée, elle est toujours conforme à la définition d'une interface fonctionnelle. Le compilateur considérera qu'il s'agit d'une interface fonctionnelle.

Ainsi, en utilisant des expressions Lambda, vous pouvez créer des instances d'interfaces fonctionnelles. Autrement dit, l'expression Lambda renvoie un type d'interface fonctionnelle.

En fait, il existe trois façons de créer des instances d'interface fonctionnelle (se référer à l'annotation FunctionalInterface) :

1 Expression Lambda

Référence de la méthode (introduction au chapitre suivant). )

3. Référence de la méthode constructeur (introduction du chapitre suivant)

Résumé : Dans cet article, nous avons ouvert la porte à l'apprentissage de Java 8, appris ce que sont les expressions lambda, compris quelle est la définition des interfaces fonctionnelles et utilisé plusieurs exemples pour démontrer la commodité des expressions lambda.

Pour plus d'articles connexes, veuillez consulter : Introduction à l'apprentissage Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles