Ci-dessous, nous continuons à plonger dans le modèle de programmation fonctionnelle Java8
classe publique test1 {public static void main (String [] args) {list <nteger> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); list.ForEach (nouveau consommateur <Integer> () {@Override public void accepte (Integer Integer) {System.out.println (Integer);}}); }}Ce programme est simple, initialisez d'abord une collection de types entiers, puis publiez chaque élément à la console. Parmi eux, nous avons remarqué la méthode foreach, qui est la méthode par défaut nouvellement ajoutée dans Java 8.
interface publique itérable <T> {. . omettre. Par défaut void foreach (Consumer <? Super T> Action) {objets.RequiRenonnull (Action); pour (t t: this) {action.accept (t); }}}Il est déclaré dans l'interface itérable et est modifié par défaut de mot-clé. De cette façon, tout sous-type de cette interface peut hériter de l'implémentation de la méthode FOREEAC, de sorte que l'interface de liste est une sous-interface indirecte d'Itable, donc elle hérite également de la méthode par défaut. Java8 adopte cette façon intelligente d'étendre les fonctions de l'interface et est compatible avec l'ancienne version.
Ensuite, nous analysons la mise en œuvre de Foreach. Tout d'abord, nous recevons une action de paramètre du type de consommateur, effectuons un jugement non vide, puis traversons tous les éléments actuels et les remettez à la méthode d'acceptation de l'action pour le traitement. Alors qu'est-ce que c'est que le consommateur? Regardez le code source
@FunctionalInterfacePublic Interface Consumer <T> {/ ** * Effectue cette opération sur l'argument donné. * * @param t L'argument d'entrée * / void accepte (t t); . .Omis.} Une interface, avec une seule méthode abstraite, est modifiée par @FunctionalInterface, une interface fonctionnelle typique.
OK, maintenant nous savons que le paramètre du type de consommateur reçu par Foreach est une interface fonctionnelle. La seule méthode abstraite d'accepter dans l'interface reçoit un paramètre et ne renvoie pas de valeur. D'après l'article précédent, nous savons que l'une des façons de créer des instances de types d'interface fonctionnelles est d'utiliser les expressions Lambda, afin que vous puissiez transformer le programme supérieur.
classe publique test1 {public static void main (String [] args) {list <nteger> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Lambda Expression reçoit un paramètre sans renvoyer la valeur List.ForEach (item -> System.out.println (élément)); }} L'élément d'expression lambda -> System.out.println (élément) reçoit un paramètre sans renvoyer une valeur et répond aux exigences de signature de la méthode d'acceptation et est compilé et réussi.
C'est-à-dire que si une expression de lambda est utilisée pour créer une instance d'interface fonctionnelle, les paramètres d'entrée et le retour de cette expression de lambda doivent être conformes à la signature de la méthode de la seule méthode abstraite de cette interface fonctionnelle.
Ensuite, le programme sera modifié
classe publique test1 {public static void main (String [] args) {list <nteger> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Method Reference list.ForEach (System.out :: println); }} J'ai vu deux colons derrière, mais j'étais en désordre de toute façon. . . Ceci est la deuxième façon de créer une instance d'interface fonctionnelle: la méthode Référence Méthode La syntaxe de référence est objet :: Nom de la méthode
De même, l'utilisation de la méthode de référence de la méthode pour créer des instances d'interface fonctionnelle doit également adhérer à la définition de la signature de la méthode. Voir le code source de la méthode println ici
public void println (objet x) {string s = string.valueof (x); synchronisé (this) {print (s); newline (); }} Recevez un paramètre et ne renvoie pas la valeur et ne le compile pas.
Enfin, jetons un coup d'œil au dernier type de création d'une interface fonctionnelle. La troisième méthode: construire la référence de la méthode et continuer à modifier le programme.
classe publique test1 {public static void main (String [] args) {list <nteger> list = arrays.aslist (1,2,3,4,5,6,7,8,9,10); // Méthode du constructeur List.ForEach (test1 :: new); } Test1 (entier i) {System.out.println (i); }} La syntaxe référencée par le constructeur est: Nom de la classe :: Nouveau
Nous avons ajouté un nouveau constructeur à Test1, qui reçoit un paramètre, ne renvoie pas de valeur et compile. (Pour montrer l'utilisation des citations du constructeur uniquement)
Sur la base de l'article précédent, nous pouvons résumer trois façons de créer des types d'interface fonctionnels:
1. Expression de lambda
2. Citation de la méthode
3. Référence de la méthode du constructeur
Remarque: Quelle que soit la méthode, la signature de la méthode doit être conforme à la méthode abstraite.