Wie kommt es, dass Lambda-Ausdrücke Objekte in Java sind? [Duplikat]
Wie sind Lambda-Ausdrucksobjekte in Java? Wie können Lambda-Ausdrücke, die Teil der funktionalen Programmierung sind, in Java implementiert werden, einer objektorientierten Sprache? Welche Java-Konzepte brauche ich, um Lambda-Ausdrücke zu verstehen?
Antworten
Sie müssen einige Dinge verstehen:
1) Funktionsschnittstelle
- Schnittstelle, die nur eine öffentliche Methode hat
public interface Runnable{
void run();
}
- Dies ist ein Beispiel für eine funktionale Schnittstelle. Sie kann verschiedene Arten von Methoden wie int haben
processNumber(int number) - Denken Sie daran, dass es nur eine Methode geben kann (eine nicht implementierte Methode, Standardeinstellungen zählen nicht).
2) Funktionsschnittstelle verwenden
- Sie können Ihre funktionale Schnittstelle in Ihrer Klasse implementieren, sagen wir MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- als Sie Ihre MyRunnable-Klasse in einer anderen Methode übergeben können, ist es nur ein normales Objekt
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- dies würde "Hallo Welt" drucken
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) Was Lambda tut
- Mit Lambda können Sie also eine anonyme Implementierung der Schnittstelle erstellen
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- dies würde "Hallo meine Welt" drucken
- Sie erstellen lediglich eine anonyme Implementierung von Runnable und übergeben sie an MyMethod
- es ist nur syntaktischer Zucker dafür
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Ein Lambda in Java ist im Grunde nur eine funktionale Schnittstelle . Es ist hauptsächlich syntaktischer Zucker .
Java ist keine funktionale Sprache und kann daher die funktionale Programmierung nicht vollständig implementieren, sondern nur einen Teil seiner Grundprinzipien. Beispielsweise können Sie in Java keine geeigneten Typklassen implementieren .
In jedem Fall gibt es keine Standarddefinition für FP, genauso wie es keine Standarddefinition für OOP gibt. Die spezifische Definition kann je nach Quelle variieren, aber die Gesamtideen sind (normalerweise) dieselben.
Java ist eine objektorientierte Sprache. Einige Funktionen aus funktionalen Sprachen sind jedoch auch in Java verfügbar, wie z. B. Lambda
Lambda ist im Grunde ein Objekt, das wie eine Funktion wirkt. Dokumentation:https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
Wie üblich hat eine Funktion einen Eingang und einen Ausgang
Eingaben in Funktionen: bezeichnet als T (wie in take)
Ausgänge in Funktion: bezeichnet als R (wie im Gegenzug)
Struktur der Erklärung: Function<T,R> var_name = input_variables -> output_expression
Beispiel: Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
oder es gibt einen anderen Weg (auch als Methodenreferenz bekannt)
Dies greift tatsächlich auf die Methode unter der Haube zu
Function<T,R> var_name = class_name :: method_name
Beispiel: Function<Double,Double>Tanh = Math::tanh
Verwenden einer Funktion
Um eine Funktion zu verwenden, müssen Sie nur die apply(T t)Methode der Funktionsklasse aufrufen
Beispiel: double num = sigmoid.apply(0)