J'écrirai un commentaire sur les expressions Java lambda.
En premier lieu, les expressions lambda sont souvent utilisées dans les langages fonctionnels pour décrire des fonctions anonymes. Il est utilisé lors de la création d'une fonction temporaire, par exemple lors de la transmission d'une fonction à une fonction.
Il n'y a pas de fonction en Java (les méthodes sont toujours définies dans les classes). Par conséquent, les expressions Java lambda se comportent comme "créer et transmettre une instance d'une interface avec une seule méthode abstraite". Elle est limitée à une seule méthode car une expression lambda ne peut décrire qu'une seule expression et une interface avec plusieurs méthodes ne détermine pas l'expression de la méthode.
Comme méthode de description
(argument) -> {En traitement}
Écrire. Les parenthèses peuvent être omises s'il n'y a qu'un seul argument ou action.
Comme exemple concret, regardons la méthode sort
de Collections
.
C'est une méthode qui trie sur le premier argument «Liste», mais si vous passez une instance de l'interface «Comparateur» au deuxième argument, la méthode «comparable» sera utilisée pour déterminer l'ordre de tri.
Par exemple, si vous souhaitez trier une liste de chaînes (strList
) par longueur de caractère, vous pouvez écrire une fonction anonyme comme suit.
Collections.sort(strList, new Comparator(){
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
})
Puisque la classe Comparator
est une interface dans laquelle seule la méthode compare
** est définie, elle peut être réécrite comme suit avec une expression lambda.
List<String> strList = Arrays.asList("a","ccc","bb");
Collections.sort(strList, (s1, s2) -> s1.length() - s2.length());
System.out.println(strList); // [a, bb, ccc]
La méthode «compare» est définie dans la classe «Comparator» comme suit.
comparing(Function<? super T,? extends U> keyExtractor);
Le type d'argument est Fonction <? Super T,? Étend U>
, qui est un type de ** interface fonctionnelle **.
L'interface fonctionnelle est une interface qui peut utiliser des expressions lambda, et différents types sont disponibles.
Cette fois, Function <? Super T ,? Extends U>
indique que l'instance a un type avec un argument de T et une valeur de retour de U.
T et U sont définis comme suit:
<T,U extends Comparable<? super U>> Comparator<T>
T est le type d'instance à comparer. U est le type de champ à comparer. Par conséquent, cette interface fonctionnelle signifie que c'est une expression qui renvoie des informations U pour comparer des instances de T.
Si vous écrivez le traitement de Collections.sort
plus tôt avec la méthode de comparaison
, ce sera comme suit.
Collections.sort(strList, comparing(s -> s.length()));
La partie s-> s.length ()
signifie appeler la méthode length de l'instance de type String s, afin qu'elle puisse être réécrite avec ** method reference **.
Une référence de méthode est une méthode de description qui facilite l'écriture du processus d'appel d'une méthode de cette classe pour une instance.
Décrivez avec nom de classe :: nom de méthode
.
Si vous écrivez l'exemple précédent avec une référence de méthode, ce sera comme suit.
Collections.sort(strList, comparing(String::length));
référence (o1, o2) -> o1 --o2 Arrêtez les sorts! --Comment utiliser Composer dans Java 8 JavaDoc:Comparator
Recommended Posts