Maison >Java >javaDidacticiel >Pourquoi une référence de méthode Java avec une valeur de retour fonctionne-t-elle avec l'interface « Consumer » ?

Pourquoi une référence de méthode Java avec une valeur de retour fonctionne-t-elle avec l'interface « Consumer » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-22 18:04:12596parcourir

Why Does a Java Method Reference with a Return Value Work with the `Consumer` Interface?

Pourquoi une référence de méthode Java avec un type de retour correspond à l'interface consommateur

Problème

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é.

Explication

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.

Distinction des expressions Lambda

Les expressions Lambda se présentent sous deux formes :

  1. ( arguments) -> expression : valeur compatible si l'expression est évaluée à une valeur.
  2. (args) -> { déclarations* } : compatible avec Void si aucun chemin de code ne tente de renvoyer une valeur.

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.

Formulaires compatibles

Les expressions qui peuvent être utilisées comme instructions (conformément à la spécification du langage Java §14.8) incluent :

  • Invocations de méthodes
  • Incrémentation/Décrémentation opérateurs
  • Affectations
  • Expressions de création d'instances de classe

Restriction

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn