Comment se fait-il que les expressions lambda soient des objets en Java? [dupliquer]
Comment sont les objets d'expressions lambda en Java? Comment les expressions lambda, qui font partie de la programmation fonctionnelle, peuvent-elles être implémentées en Java, qui est un langage orienté objet? De quels concepts Java ai-je besoin pour comprendre les expressions lambda?
Réponses
Vous devez comprendre peu de choses:
1) Interface fonctionnelle
- interface qui n'a qu'une seule méthode publique
public interface Runnable{
void run();
}
- c'est un exemple d'interface fonctionnelle, il peut avoir différents types de méthodes telles que int
processNumber(int number) - rappelez-vous simplement qu'il ne peut y avoir qu'une seule méthode (une méthode non implémentée, les valeurs par défaut ne comptent pas)
2) Utilisation de l'interface fonctionnelle
- vous pouvez implémenter votre interface fonctionnelle dans votre classe disons MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- que vous pouvez passer votre classe MyRunnable dans une autre méthode, son objet juste normal
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- cela imprimerait "Hello world"
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) Que fait lambda
- donc ce que lambda vous permet de faire est de créer une implémentation anonyme de l'interface
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- cela imprimerait "Bonjour mon monde"
- vous créez juste une implémentation anonyme de Runnable et la transmettez à MyMethod
- c'est juste du sucre syntaxique pour ça
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Un lambda en Java n'est en fait qu'une interface fonctionnelle . C'est principalement du sucre syntaxique .
Java n'est pas un langage fonctionnel et, en tant que tel, il ne peut pas implémenter pleinement la programmation fonctionnelle, seulement un sous-ensemble de ses principes fondamentaux. Par exemple, vous ne pouvez pas implémenter des classes de types appropriées en Java .
Dans tous les cas, il n'y a pas de définition standard pour FP, tout comme il n'y a pas de définition standard pour POO. La définition spécifique peut varier en fonction des sources, mais les idées générales sont (généralement) les mêmes.
Java est un langage orienté objet. Mais certaines fonctionnalités des langages fonctionnels sont également disponibles en java comme lambda
lambda est fondamentalement un objet qui agit comme une fonction. Documentation :https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
comme d'habitude une fonction a une entrée et une sortie
entrées dans les fonctions: référencées T (comme dans take)
sorties en fonction: référencées R (comme en retour)
structure de la déclaration: Function<T,R> var_name = input_variables -> output_expression
exemple : Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
ou il existe un autre moyen (également appelé référence de méthode)
c'est en fait accéder à la méthode sous le capot
Function<T,R> var_name = class_name :: method_name
exemple : Function<Double,Double>Tanh = Math::tanh
Utiliser une fonction
Pour utiliser une fonction, il vous suffit d'appeler la apply(T t)méthode de la classe de fonction
exemple : double num = sigmoid.apply(0)