La première expression de lambda
Avant que Lambda n'apparaît, si nous devions écrire un multithread, nous pourrions avoir besoin de la méthode suivante:
Runnable runnable = new runnable () {@Override public void run () {System.out.println ("bonjour runnable"); }}; ... thread.start ();L'exemple ci-dessus sera beaucoup plus facile si vous passez à l'utilisation de Lambda:
Runnable noargs = () -> System.out.println ("Hello lambda! ~"); ... thread.start ();Une expression de lambda est une fonction anonyme qui transmet un comportement comme des données. L'expression utilise -> pour séparer les paramètres du corps, -> pour précéder la partie du paramètre, puis c'est la partie du corps.
Autres formes de lambda
BinaryOperator <long> add = (x, y) -> x + y; // ou binaryoperator <long> add = (long x, long y) -> x + y; // ou binaryoperator <long> add = (long x, long y) -> {x + y; };Ce qui précède sont toutes les formes d'expressions de lambda.
Alors la question est:
Qu'est-ce que binaryOperator <long> add = (long x, long y) -> x + y; signifier?
Cette ligne de code ne parle pas d'ajouter des nombres, mais crée une fonction pour calculer le résultat de l'ajout de deux nombres. Le type d'ajout est binaryoperator <long>, qui n'est pas la somme de deux nombres, mais le code qui ajoute deux nombres. L'exemple suivant montre comment utiliser cette variable:
BinaryOperator <long> add = (long x, long y) -> x + y; Long res = add.Apply (3L, 4L); System.out.println ("Res =" + Res); // OUTPUT: RES = 7 Interface de fonction
Une interface de fonction est une interface avec une seule méthode abstraite, utilisée comme type d'expression de lambda.
Par exemple, Runnable est une interface de fonction.
Créer une nouvelle interface de fonction:
Interface publique addopérateur <t, d> {long ajouter (t un, d deux);}utiliser:
AddOperator <long, long> addopérateur = (x, y) -> x + y; System.err.println ("Custom Function Écouteur Res =" + AddOperator.Add (34L, 65L)); Type cible
Le type cible fait référence au type du contexte dans lequel se trouve l'expression de lambda. Par exemple, affectez une expression de lambda à une variable locale ou passez-la à une méthode en tant que paramètre. Le type de la variable locale ou du paramètre de méthode est le type cible de l'expression de lambda.
Final
Si nous référons la variable locale dans la méthode dans la classe intérieure anonyme, cela nécessite que la variable locale soit finale.
Dans Lambda, nous n'avons pas besoin de déclarer la variable locale externe référencée comme final, mais la variable ne peut être attribuée qu'une seule fois.
Dans l'exemple suivant, si nous supprimons les commentaires et attribuons à nouveau le nom, il ne sera pas compilé et un message d'erreur sera affiché: les variables locales référencées à partir d'une expression de lambda doivent être finales ou effectivement finales.
La variable locale référencée par l'expression de Lambda doit être définitive ou une finale factuelle.
String name = getUserName (); // name = "hi"; Button.addactionListener (event-> System.out.println ("name =" + name)); Type d'inférence
L'inférence de type des expressions de lambda est une extension de l'inférence de type cible introduite dans Java7.
Type d'inférence dans Java7:
List <string> list = new ArrayList <> ();
Dans l'exemple ci-dessus, nous n'avons pas spécifié le type de paradigme d'arrayList, mais nous avons plutôt déduit le type de paradigme d'arrayList basé sur le type de liste.
Par exemple: AddOperator <Long, Long> addOperator = (x, y) -> x + y;
Grâce à cet article, j'espère qu'il peut vous aider à apprendre et à comprendre cette partie des connaissances. Merci pour votre soutien pour ce site Web!