Qu'est-ce que l'utilisation de la Fonctionnelle de l'Interface en Java 8?
Je suis tombé sur un nouveau terme nommé Interface Fonctionnelle dans Java 8.
Seulement je pouvais trouver une utilisation de cette interface, tout en travaillant avec les expressions lambda.
Java 8 fournit quelques intégré interfaces fonctionnelles et si nous voulons définir une interface fonctionnelle alors nous pouvons faire usage de la @FunctionalInterface
annotation. Il va nous permettre de déclarer qu'une seule méthode dans l'interface.
Par exemple:
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
Combien il est utile dans Java 8, autres que simplement de travailler avec les expressions lambda?
La question ici est différente de celle que j'ai posée. C'est à se demander pourquoi nous avons besoin de Interface Fonctionnelle tout en travaillant avec une expression Lambda. Ma question est: pourquoi Interface Fonctionnelle autres que ceux directement avec les expressions lambda?
- Il semble duplcate à ce lien. Ils parlent aussi de pourquoi il devrait y avoir une seule méthode Fonctionnelle de l'Interface. stackoverflow.com/questions/33010594/...
- J'ai vu cette question avant de poster... à la Fois les questions du sens de la différence...
- découvrez une explication détaillée sur les interfaces fonctionnelles et des changements sur les interfaces de java 8: sysdotoutdotprint.com/index.php/2017/04/22/java-8-interface
Vous devez vous connecter pour publier un commentaire.
@FunctionalInterface
annotation est utile pour la compilation, la vérification de votre code. Vous ne pouvez pas avoir plus d'une méthode d'ailleursstatic
,default
et de méthodes abstraites qui remplacent les méthodes deObject
dans votre@FunctionalInterface
ou de toute autre interface utilisé comme une interface fonctionnelle.Mais vous pouvez utiliser des lambdas sans cette annotation ainsi que vous pouvez remplacer les méthodes sans
@Override
annotation.De docs
Ce peut être utilisé dans l'expression lambda:
Ce ne peut pas être utilisé dans l'expression lambda:
Mais cela donnera erreur de compilation:
java.lang.Object
dans une interface fonctionnelle.public
méthode d'ailleursstatic
etdefault
”...obj -> obj.doSomething(anyObj)
. Merci pour remarquer!Pas du tout. Les expressions Lambda sont le seul et unique point de cette annotation.
@Override
pour permettre au compilateur de savoir que vous l'intention d'écrire quelque chose qui a été "fonctionnelle" (et obtenez une erreur si vous avez glissé).La la documentation fait effectivement une différence entre le but
et le cas d'utilisation
dont la formulation n'exclut pas d'autres cas d'utilisation en général. Puisque le but principal est d'indiquer une interface fonctionnelle, votre question se résume à “il existe d'autres cas d'utilisation pour interfaces fonctionnelles autres que les expressions lambda et de la méthode ou le constructeur références?”
Depuis interface fonctionnelle est un Java construction du langage défini par le Langage Java Specification, seulement que les spécifications ne peut répondre à cette question:
JLS §9.8. Interfaces Fonctionnelles:
De sorte que le Java Langage de Spécification n'est pas dire le contraire, le seul cas d'utilisation mentionnées dans cette section est celle de la création de l'interface de cas avec la méthode de référence, les expressions et les expressions lambda. (Cela comprend les références constructeur comme ils sont notés comme une forme de méthode de référence de l'expression dans le cahier des charges).
Donc en une phrase, non, il n'y a pas d'autres cas d'utilisation dans Java 8.
Comme d'autres l'ont dit, une interface fonctionnelle est une interface qui expose une méthode. Il peut avoir plus d'une méthode, mais tous les autres doivent avoir une implémentation par défaut. La raison pour laquelle il est appelé une "interface fonctionnelle" c'est parce qu'il agit en fait comme une fonction. Puisque vous pouvez passer des interfaces en tant que paramètres, cela signifie que les fonctions sont désormais "des citoyens de première classe" comme dans les langages de programmation fonctionnelle. Cela a de nombreux avantages, et vous verrez beaucoup quand utiliser le Flux de données de l'API. Bien sûr, les expressions lambda sont la principale utilisation évidente pour eux.
Une expression lambda peut être attribué à une interface fonctionnelle type, mais peut donc la méthode des références et des classes.
Quelque chose de gentil à propos des interfaces fonctionnelles dans
java.util.function
, c'est qu'ils peuvent être composés de créer de nouvelles fonctions (commeFunction.andThen
etFunction.compose
,Predicate.and
, etc.) en raison de la pratique par défaut des méthodes qu'ils contiennent.Une interface avec une seule méthode abstraite est appelée Interface Fonctionnelle.
Il n'est pas obligatoire d'utiliser @FunctionalInterface, mais il est recommandé de l'utiliser avec des interfaces fonctionnelles pour éviter l'ajout de méthodes accidentellement. Si l'interface est annotée avec @FunctionalInterface annotation et nous essayons d'avoir plus d'une méthode abstraite, il jette erreur du compilateur.
@FunctionalInterface
est une nouvelle annotation sont libérés avec Java 8 et de fournir des types de cibles pour les expressions lambda et il a utilisé sur la compilation, la vérification de votre code.Lorsque vous souhaitez l'utiliser :
1 - Votre interface ne doit pas ont plus d'une des méthodes abstraites, sinon erreur de compilation sera donné.
1 - Votre interface Devrait être pur, ce qui signifie interface fonctionnelle est destiné à être mis en œuvre par les apatrides, les classes, les exmple de pure est
Comparator
interface parce que sa dépend pas de la mise en œuvre de l'état, dans ce cas Pas erreur de compilation sera donné, mais dans de nombreux cas, vous ne serez pas en mesure d'utiliser lambda avec ce genre d'interfacesLa
java.util.function
paquet contient diverses à usage général d'interfaces fonctionnelles telles quePredicate
,Consumer
,Function
, etSupplier
.Veuillez également noter que vous pouvez utiliser lambdas sans cette annotation.
Vous pouvez utiliser lambda dans Java 8
Pour plus d'infos sur Les Lambdas De Java et FunctionalInterfaces
À côté d'autres réponses, je pense que la principale raison du "pourquoi à l'aide de Interface Fonctionnelle autre que directement avec les expressions lambda" peut être liée à la nature du langage Java qui est Orienté Objet.
Les principaux attributs des expressions Lambda sont: 1. Ils peuvent être passés autour de 2. et ils peuvent exécuté à l'avenir dans le temps spécifique (à plusieurs reprises). Maintenant, à l'appui de cette fonctionnalité dans les langues, certaines autres langues traiter simplement avec cette question.
Par exemple en Java Script, une fonction (fonction Anonyme, ou des littéraux de Fonction) peut être traitée comme un objet. Ainsi, vous pouvez créer, tout simplement, et ils peuvent aussi être affectée à une variable et ainsi de suite. Par exemple:
ou via ES6, vous pouvez utiliser une flèche de fonction.
Jusqu'à maintenant, le langage Java les concepteurs n'ont pas accepté de gérer les caractéristiques mentionnées par l'intermédiaire de ces modalités (fonctionnelles, techniques de programmation). Ils croient que le langage Java est Orienté Objet et par conséquent, ils devraient résoudre ce problème via les techniques de programmation Orientée Objet. Ils ne veulent pas manquer la simplicité et de la cohérence du langage Java.
Par conséquent, ils utilisent des interfaces, comme lorsqu'un objet, d'une interface avec une seule méthode (je veux dire l'interface fonctionnelle) est nécessaire, vous pouvez la remplacer par une expression lambda. Tels que:
Interface Fonctionnelle:
Exemple 1:
Exemple 2:
Exemple 3:
Java8 annotation --
@FunctionalInterface
Applications de l'Interface Fonctionnelle:
Pour en savoir interfaces fonctionnelles, apprendre d'abord méthodes par défaut dans l'interface, et après l'apprentissage fonctionnel de l'interface, il sera facile pour vous de comprendre la méthode de référence et de l'expression lambda