Maison  >  Article  >  Java  >  Pourquoi une référence de méthode avec une valeur de retour peut-elle être attribuée à une interface consommateur en Java ?

Pourquoi une référence de méthode avec une valeur de retour peut-elle être attribuée à une interface consommateur en Java ?

DDD
DDDoriginal
2024-11-20 14:51:15817parcourir

Why Can a Method Reference with a Return Value Be Assigned to a Consumer Interface in Java?

Comprendre les références de méthodes avec l'interface consommateur

En Java, les références de méthodes peuvent être utilisées pour créer des instances d'interfaces fonctionnelles. Cependant, dans certains scénarios, une confusion peut survenir lorsque le type de retour d'une référence de méthode ne correspond pas à la méthode accept de l'interface Consumer.

Considérez le 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;

Comme vous On pourrait s'y attendre, l'affectation de lambda3 à un consommateur devrait échouer car le type de retour de la méthode de consommation (String) ne correspond pas au type vide attendu de l'acceptation. méthode.

Cependant, étonnamment, l'affectation de lambda3 réussit. Cela est dû à une décision de conception qui permet d’adapter une méthode à une interface fonctionnelle de la même manière que la méthode peut être appelée. Cela signifie que n'importe quelle méthode de retour de valeur peut être attribuée à un consommateur, sa valeur de retour étant ignorée.

En ce qui concerne les expressions lambda, les règles sont légèrement plus complexes. Les expressions lambda ont deux formes :

  1. (args) -> expression
  2. (args) -> { déclarations* }

La première forme ((args) -> expression) est compatible avec les valeurs uniquement si l'expression est évaluée à une valeur. La deuxième forme ((args) -> { déclarations* }) peut être compatible avec void si aucun chemin de code ne tente de renvoyer une valeur.

L'expression s -> s n'est pas vide compatible car s n'est pas une instruction. Toutefois, les expressions ayant des effets secondaires, telles que les appels de méthodes, peuvent être utilisées comme instructions. Cela signifie que des expressions telles que s -> s.toString() et s -> je peux être compatible avec void.

Par conséquent, dans le cas de LambdaTest::consume, la référence de méthode est attribuée à l'interface Consumer car la méthode consume peut être appelée et sa valeur de retour peut être ignorée. Cette décision de conception permet une adaptabilité entre les méthodes et les interfaces fonctionnelles, même lorsque les types de retour ne correspondent pas.

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