Un mécanisme pour affecter le code que vous souhaitez exécuter à une variable de type d'interface qui n'a qu'une seule méthode à implémenter.
Une interface fonctionnelle est une interface qui n'a qu'une seule ** méthode ** à implémenter. Il est appelé «type de fonction» car une sortie est déterminée pour chaque entrée.
Type d'interface | Méthodes à mettre en œuvre | Fonctionnalité |
---|---|---|
Consumer<T> | void accept(T) | Reçoit et traite les arguments. Arguments qui ne renvoient pas de résultatsconsommateur |
Supplier<T> | T get() | Renvoyer uniquement le résultat sans rien recevoirFournisseur |
Predicate<T> | boolean test(T) | Prenez un argument et évaluez-leAssertif |
Function<T, R> | R apply(T) | Reçoit un argument et le type spécifié(R)Renvoie le résultat deProcesseur |
Référence) Classe pour l'expression lambda Java8
** - La méthode forEach de l'interface java.util.List peut accepter les expressions lambda de type Consumer **
référence)
Liste des interfaces pour les documents officiels
Exemple)
public static void main(String[] args){
List<Integer> list = List.of(1,2,3);
list.forEach((x) ->{System.out.println(x)}); //Reçoit et traite les arguments et ne renvoie pas de valeurs
}
** · La méthode toUpperCase ** de la classe java.lang.String peut recevoir une expression lambda de type Function
référence Document officiel toUpperCase ()
Exemple)
public static void main(String[] args){
Function<String, String> func = (x) -> {return x.toUpperCase();}; //Prend un argument et renvoie un résultat du type spécifié
System.out.println(func.apply("hello world"));
}
Basique
Type de fonction type d'interface Nom de la variable = (argument) -> {// Traitement ** return **};
Function<String, String> func = (x) -> { return x.toUpperCase(); };
<Lorsqu'il y a un argument, () est omis>
Type de fonction type d'interface Nom de la variable = Argument-> {// Traitement ** return **};
Function<String, String> func = x -> { return x.toUpperCase(); };
<Lorsqu'il n'y a qu'un seul processus, {} est omis>
Type de fonction type d'interface Nom de la variable = Arguments-> // Traitement; ** * Je ne peux pas écrire une déclaration de retour! !! ** **
list.forEach( x -> System.out.println(x) );
** [L'argument formel de l'expression lambda est une constante ou une constante substantiellement] **
-Exemple d'erreur de compilation (de Java Silver Kuromoto)
void sample(){
int i = 0;
Supplier<Integer> foo = () -> i;
i++; //j'ai besoin d'être sensiblement constant
System.out.println(foo.get());
}
** [Notez le type de données de l'argument] ** Les déclarations de variables d'expression Lambda peuvent ** omettre de spécifier les types de données **. Parce que vous pouvez déduire le type de l'argument du type de l'interface fonctionnelle que vous essayez d'attribuer.
Même si vous écrivez une variable d'expression lambda avec ses arguments omis et le type omis, il s'agit d'une variable nouvellement définie. → ** Vérifiez si elle chevauche une variable existante dans la portée de l'expression lambda! !! ** **
-Exemple d'erreur de compilation
final String val = "Hello World";
Consumer<String> func = (val) -> System.out.println(val); //Nom en double causé par la valeur de l'expression lambda et la valeur de la variable locale, erreur de compilation
** [Notez la portée] ** L'expression lambda ** scope ** couvre tout le bloc dans lequel l'expression lambda est écrite
-Exemple d'erreur de compilation
public class Main{
public static void main(String[] args){
Srting val = "A"; //Variable locale val dans la portée de l'expression lambda
Function f = (val) -> { //Variable d'expression lambda val
System.out.println(val);
};
}
}
Pour être honnête, je ne comprends toujours pas du tout le style Lambda ... Je voudrais comprendre le site suivant sur le mécanisme de type lambda.
Computer Science and Magic Y Combinator
De plus, je ne comprends pas vraiment quand utiliser l'expression lambda. Quelles sont les méthodes qui peuvent accepter les expressions lambda? Est-il toujours disponible lors de l'écriture de processus simples qui ne sont pas réutilisés? Peut-il être utilisé uniquement par la méthode de l'interface fonctionnelle? Comment le distingue-t-il d'une méthode d'interface fonctionnelle?
Il y a beaucoup de choses que je ne comprends pas.
Recommended Posts