Pour la grammaire de base des expressions lambda, on est de comprendre les expressions lambda grammaire de base, et l'autre est la nécessité de comprendre l'interface de fonction
A, des expressions lambda décrivant la grammaire de base
java8 introduit nouvel opérateur ->, peut être appelé opérateur lambda ou l'opérateur de flèche, l'opérateur sera divisé en deux parties expression lambda.
Gauche: liste des paramètres
A droite: les expressions de code à exécuter, qui est le corps lambda
lambda format général sont les suivantes:
La première: aucun paramètre et ne renvoie aucune valeur
La seconde: Il y a des paramètres, aucune valeur de retour
Variante 1: l'argument de type peut être omis
Variante 2: Il y a un paramètre, le paramètre peut être omis entre parenthèses
Troisièmement: Il y a des paramètres, la valeur de retour
Variantes: déclaration lambda corps d'exécution est une seule, peut être omis et le retour des accolades corps lambda
Deux, expressions lambda échantillon
1, une expression, aucun paramètre et ne renvoie aucune valeur
/ * * * Lambda表达式一 * / publics vides test1 () { // jdk1.7之前 Runnable runnable = nouvelle Runnable () { @Override publique vide run () { système. out .print ( " bonjour RUNNABLE " ); } }; runnable.run (); Système. sur .println ( " ============================= " ); // 使用lambda表达式 Runnable runnable1 = () -> Système. en dehors.println ( " bonjour lambda " ); runnable1.run (); }
2, deux expressions: Là paramètres et renvoie aucune valeur
publique vide test2 () { Comparator <Entier> = comparateur (entier x, entier y) -> Integer.compare (x, y); }
Variante 1: le type de paramètre peut être omis (c'est parce que le compilateur jvm peut être déduit du contexte du type à la compilation, pour en déduire le type de sortir l'argument, d'autres ici et ne doivent pas être omis sont omis, et certains paramètres ne peut être omis, il paramètre n'est pas omis)
publique vide test3 () { Comparator <Entier> comparateur = (x, y) -> Integer.compare (x, y); }
Variante 2: Il y a un paramètre, le paramètre peut être omis entre parenthèses
publique vide test4 () { consommateur <String> consommateur = x -> Système. sur .println (x); consumer.accept ( " bonjour " ); }
Troisièmement: Il y a des paramètres, la valeur de retour
publique vide test5 () { Comparator <Entier> = comparateur (entier x, entier y) -> { log.info ( " bonjour test5 " ); retour Integer.compare (x, y); }; }
Variantes: corps lambda pour effectuer une seule déclaration, vous pouvez revenir et accolades corps lambda omis (en fait, cela a déjà été démontré, une sorte de la deuxième variante)
publique vide test3 () { Comparator <Entier> comparateur = (x, y) -> Integer.compare (x, y); }
Résumé:
Dans le cas d'une province entre parenthèses gauche et droite
À gauche de l'inférence de type province
En troisième lieu, la fonction d'interface
expression lambda doit prendre en charge l'interface fonctionnelle, une interface de fonctions d'interface qui est seulement une mise en œuvre. Les annotations peuvent être utilisées pour tester @FunctionalInterface
En quatrième lieu, la fonction d'interface échantillon (java8 fournit quatre fonctions de l'interface de base, suivi va être décrit)
Créer une interface de fonction
emballer com.example.jdk8demo.lambda; @FunctionalInterface publique Interface MyInterface { Entier getInteger (entier i); }
Les nouveaux appels de méthode d'interface de fonction
publique entier getInteger (entier i, MyInterface mi) { retour mi.getInteger (i); }
La dernière étape consiste à utiliser des expressions lambda logiques de mise en œuvre spécifique
publique vide test6 () { // obtenir 10 carrés log.info ( " ============ " + getInteger ( 10 , (X) -> X * X)); }