Considérez l'extrait de code suivant :
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
Selon l'interface Consumer, il est défini comme void accept(T t); par conséquent, on peut être intrigué par l'affectation de lambda3 car la méthode consume renvoie une chaîne. Étonnamment, lambda4 est également attribué.
Ce scénario est attribué à la conception flexible des références de méthodes en Java. Il permet d'adapter une méthode à une interface fonctionnelle de la même manière que l'on appelle directement la méthode. En d'autres termes, on peut invoquer n'importe quelle méthode de retour de valeur et ignorer la valeur renvoyée.
Les expressions Lambda se présentent sous deux formes :
L'expression s -> s n'est pas compatible avec le vide car s n'est pas une instruction. Cependant, s -> s.toString() peut l'être puisque les invocations de méthodes sont des instructions.
Les expressions qui peuvent être utilisées comme instructions (conformément à la spécification du langage Java §14.8) incluent :
Il est important de noter que la forme (arg) -> methodReturningVoid(arg) est la seule forme d'expression qui n'est pas compatible avec les valeurs.
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!