L'origine des expressions Java lambda

Expression lambda Java

introduction

Je suis liitFeet, un ingénieur côté serveur. Récemment, je me sens comme Coroutine WebFlux exclusivement avec kotlin et Spring Boot. Coroutine difficile ...

Cet article est le 7ème jour du calendrier de l'avent TeamLab Engineering.

Dans cet article, j'expliquerai l'origine des expressions Java lambda. Eh, maintenant? Il y a un sentiment comme ça, mais maintenant que je peux gérer des fonctions telles que go et kotlin comme des objets de première classe, j'ai pensé qu'il semble que j'utilise réellement le contenu de l'expression lambda sans savoir ce que c'est.

L'essentiel est que les expressions java lambda implémentent une interface avec une seule méthode pour créer une instance (nouvelle). Je ne pense pas que cette explication prête à confusion, je vais donc expliquer le processus jusqu'à l'expression lambda dans l'ordre, en utilisant un programme qui affiche le résultat du calcul d'une certaine expression à titre d'exemple.

  1. Passez une classe normale comme argument
  2. Passez la classe interne comme argument
  3. Passez une classe anonyme en argument
  4. Passez l'expression lambda comme argument

Je pense que c'est plus facile à comprendre si vous savez que les expressions lambda sont faciles à lire pour les humains et les compilateurs tout en réduisant la quantité de description.

En outre, cet article décrit l'origine des expressions Java lambda, Veuillez noter que nous n'expliquerons pas l'expression lambda elle-même en détail (s'il n'y a qu'un seul argument, vous n'avez pas besoin d'écrire de parenthèses, d'interface fonctionnelle, etc.).

Le code source peut être trouvé sur GitHub.

Passer une classe normale comme argument

Tout d'abord, je voudrais réaliser un programme qui affiche le résultat calculé en passant une classe normale. Le code source est le package normalClass. Il y a quatre sources ci-dessous.

Main.classe principale java
Display.java Class pour afficher le résultat du calcul
CalcuratorInterface.Interface définie pour le calcul Java
Display.java                CalcuratorInterface

Tout d'abord, dans la classe Display, il reçoit la calculatrice en charge du calcul et la valeur (a, b) à calculer. Calculez et affichez la valeur de (a, b) avec la calculatrice.

public class Display {
    public void showCalc(CalculatorInterface calculator, int a, int b) {
        System.out.println(calculator.calc(a, b));
    }
}

CalculatorInterface définit calc, une méthode qui effectue des calculs.


public interface CalculatorInterface {
    int calc(int a, int b);
}

AddCalculator implémente CalculatorInterface et renvoie la somme des arguments (a, b).

public class AddCalculator implements CalculatorInterface {

    @Override
    public int calc(int a, int b) {
        return a + b;
    }
}

Dans la classe Main, le résultat du calcul est affiché en transmettant la valeur calculée à la classe Display en tant que `` calculatrice ''.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();
        CalculatorInterface calculator = new AddCalculator();
        display.showCalc(calculator, 3, 5);
    }
}

Je pense qu'il n'y a pas de problème particulier.

Livraison en classe intérieure

Ensuite, je voudrais utiliser la classe interne. Le code source est le package innerClass. CalcuratorInterface.java et Display.java sont inchangés.

Si vous utilisez la classe normale mentionnée ci-dessus, ne pensez-vous pas qu'il est gênant de créer un fichier de classe uniquement pour l'ajout qui n'est utilisé que pour la classe Main? Par conséquent, vous pouvez éliminer AddCalculator.java en définissant AddCalculator dans Main comme indiqué ci-dessous.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Définir la classe interne
        class AddCalculator implements CalculatorInterface {

            @Override
            public int calc(int a, int b) {
                return a + b;
            }
        }

        CalculatorInterface calculator = new AddCalculator();
        display.showCalc(calculator, 3, 5);
    }
}

Passer une classe anonyme en tant que fonction

Ensuite, nous utiliserons la classe anonyme. Le code source est le package anonymousInnerClass. J'ai utilisé la classe interne et je n'ai pas eu à créer un fichier de classe, mais si je ne l'utilise qu'une fois ici, je n'ai pas besoin de nommer cette classe. Par conséquent, implémentons la classe sur place au moment de l'attribuer à la calculatrice.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Jetable une fois
        CalculatorInterface calculator = new CalculatorInterface() {
            @Override
            public int calc(int a, int b) {
                return a + b;
            }
        };
        display.showCalc(calculator, 3, 5);
    }
}

Ceci est une classe anonyme. Il ne peut pas être réutilisé, mais la quantité de description a progressivement diminué.

Style Lambda

Enfin, passer des arguments à l'aide d'expressions lambda. Le code source est lambdaExpression Package. En utilisant une classe anonyme, j'ai pu omettre le nom de la classe et réduire la quantité de description. Cependant, si vous implémentez CalculatorInterface, il semble que le compilateur le fera pour vous sans écrire `` new CalculatorInterface () ''. En outre, s'il n'y a qu'une seule méthode, la méthode à implémenter est déterminée de manière unique. Le type de l'argument de méthode est également défini dans l'interface, et le compilateur peut déduire le type sans le déclarer.

Dans les expressions lambda, vous pouvez créer une instance en écrivant uniquement les méthodes requises pour l'implémentation.

public class Main {
    public static void main(String[] args) {
        Display display = new Display();

        //Seul le traitement de la méthode à mettre en œuvre
        CalculatorInterface calculator = (a, b) -> {
            return a + b;
        };

        display.showCalc(calculator, 3, 5);
    }
}

L'expression lambda est la partie suivante. Cette partie représente l'implémentation de la méthode calc de CalculatorInterface.

(a, b) -> {
    return a + b;
};

(a, b)Est un argument. Je ne prends pas la peine d'écrire l'argument de la méthode car le type est défini dans l'interface. ->Voici la mise en œuvre de la méthode.a+bEst de retour.

Résumé

Qu'as-tu pensé. J'espère que vous pouvez comprendre la signification du premier énoncé "les expressions java lambda implémentent une interface avec une seule méthode et créent une instance (nouvelle)"!

C'est un aparté complet, mais ce serait bien si vous pouviez gérer la fonction comme un objet de première classe comme kotlin ... Les arguments sont faciles à comprendre ...

val calculator = {a: Int, b: Int -> a + b}
showCalc(calculator, 3, 5)
fun showCalc(calc: (Int, Int) -> Int, a: Int, b: Int) {
  println(calc.invoke(a, b))
}

Recommended Posts

L'origine des expressions Java lambda
Utiliser des expressions Java lambda en dehors de l'API Stream
Comprendre les expressions lambda Java 8
Expliquer les expressions lambda Java 8
[Java] Résumé de la façon d'omettre les expressions lambda
[Java] Résumé des expressions régulières
[Java] Introduction à l'expression lambda
[Java Silver] Résumé des points liés aux expressions lambda
[Pour les débutants] Comprendre rapidement les bases de Java 8 lambda
[Java] Trier la liste à l'aide de flux et d'expressions lambda
Expression lambda Java apprise avec Comparator
[Java] Supprimer les éléments de la liste
[Introduction à Java] À propos des expressions lambda
[Édition Java] Histoire de la sérialisation
À propos de Lambda, Stream, LocalDate de Java8
Comment utiliser les expressions Java lambda
Comprendre un peu la formule lambda
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
Examiner la liste des polices disponibles dans AWS Lambda + Java
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
Obtenez le résultat de POST en Java
Nommer un groupe d'expressions régulières (Java)
Vérifiez le contenu du magasin de certificats Java
Examiner l'utilisation de la mémoire des éléments Java
Récapitulons maintenant l'expression lambda Java
[Java] Obtenez le jour d'un jour spécifique
Mémo: [Java] Vérifiez le contenu du répertoire
Comparer les éléments d'un tableau (Java)
[jour: 5] J'ai résumé les bases de Java
Quelles sont les fonctionnalités mises à jour de Java 13
Retour sur les bases de Java
Sortie du livre "Introduction à Java"
L'histoire de l'écriture de Java dans Emacs
[Java] Vérifiez le nombre d'occurrences de caractères
Bonjour Java Lambda
[Java] Expression Lambda
[Java] Présentation de Java
Expression lambda Java
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
JAVA: jar, aar, affichez le contenu du fichier
L'histoire de la fabrication d'un Othello ordinaire à Java
[Android] [Java] Gérer l'état de CheckBox de ListView
A propos de l'ordre de description des propriétés système Java
À propos de l'idée des classes anonymes en Java
[Java] Accéder à l'URL signée de s3 (version signée 2)
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
[Java] Obtenir la longueur de la chaîne de paire de substitution
[Java] La partie déroutante de String et StringBuilder
[Note] Java: mesure la vitesse de concaténation de chaînes
J'ai comparé les caractéristiques de Java et .NET
[Java] Faites attention au type de clé de la carte
Calculer le score de similarité des chaînes de caractères avec JAVA
Essayez Progate Free Edition [Java II]
[Java / Kotlin] Redimensionner en tenant compte de l'orientation de l'image
La date et l'heure de java8 ont été mises à jour
Importer des fichiers de la même hiérarchie en Java
Première touche de la classe Files (ou Java 8)