Une expression lambda permet de définir un block de code qui peut être assigné à une référence d'une méthode.
Une expression lambda peut être utilisée dans plusieurs context:
-
Initialiser une variable ou un tableau.
-
Arguments de méthodes ou de constructeurs
-
Valeur de retour de méthodes
-
Expression conditionnelle "?:"
La syntaxe d'une expression lambda est comme suit:
paramètres -> implémentation
-
Les paramètres définissent les variables qui vont être utilisées comme argument lors de l'execution de l'expression lambda.
Il n'est pas nécessaire de specifier le type des paramètres lorsque le compilateur peut en inférer le type dépendamment du context d'utilisation de l'expression lambda.
Il est possible de définir une expression lambda qui n'accepte pas de paramètres.
Exemples:
- types explicites :
(Integer i, Integer j) -> i + j;
- types inférés :
(i, j) -> i + j;
- pas de paramètres :
() -> Math.random();
-
L'implementation définit une expression ou un bloc d'instructions.
Exemples:
- expression :
(String s) -> s.toUpercase();
- bloc d'instructions :
(String s) -> { return s.toUpercase(); }
-
L’expression lambda peut retourner une valeur dont le type est inféré automatiquement par le compilateur.
Exemples:
- expression :
() -> "hello!";
- bloc d'instructions :
() -> { return "hello!"; }
- aucune valeur retournée :
() -> System.out.println("Hello!");
L'implementation d'une expression lambda est similaire au code habituelle (bloc d'instructions) qu'on écrit pour implementer des méthodes.
Cependant quelques restrictions sont à respecter,
comme l'incapacité d'écrire des instructions
continue/break à moins que ca soit à l'intérieur d'une boucle.
Aussi il n'est pas possible de lancer des exceptions vérifiées par le compilateur (checked exceptions).
Le code d’une expression lambda peut référencer des variables locales ansi que des variables d’instances et des variables de classe (statique).
Typiquement la variable local doit être déclarée avec le modificateur
final
mais ce n’est pas une nécessité tant que la variable est implicitement utilisée comme une variable finale.
Les expressions lambda peuvent être assignées à des références des interfaces declarant une seule méthode.
Exemple :