Comment se fait-il que les expressions lambda soient des objets en Java? [dupliquer]

Nov 06 2020

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

2 JakubZnamenáček Nov 06 2020 at 19:17

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");
        });
}
1 m0skit0 Nov 06 2020 at 17:50

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.

Coder Nov 06 2020 at 19:04

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)