Ist es in Java möglich, dass ein Lambda mehrere verschiedene Typen akzeptiert?
Dh: Einzelne Variable funktioniert:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs funktionieren auch:
Function <Integer [], Integer> multiAdder = ints -> {
int sum = 0;
for (Integer i : ints) {
sum += i;
}
return sum;
};
//....
System.out.println ((multiAdder.apply (new Integer [] { 1, 2, 3, 4 })));
Aber ich möchte etwas, das viele verschiedene Arten von Argumenten akzeptieren kann, z.
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
Die Hauptanwendung besteht darin, der Einfachheit halber kleine Inline-Funktionen in Funktionen zu haben.
Ich habe mich bei Google umgesehen und das Funktionspaket von Java überprüft, konnte es aber nicht finden. Ist das möglich?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
dem Zusammenstößejava.util.function.Function<T,R>
für die Anfänger unklar sein könnten.Für etwas mit 2 Parametern könnten Sie verwenden
BiFunction
. Wenn Sie mehr benötigen, können Sie Ihre eigene Funktionsoberfläche wie folgt definieren:Wenn es mehr als einen Parameter gibt, müssen Sie die Argumentliste in Klammern setzen, wie folgt:
quelle
In diesem Fall können Sie Schnittstellen aus der Standardbibliothek (Java 1.8) verwenden:
Es gibt ein kleines (nicht das beste) Beispiel für eine Standardmethode in der Schnittstelle:
quelle
So verwenden Sie Lambda: Es gibt drei Arten von Operationen:
1. Parameter akzeptieren -> Consumer
2. Rückgabewert boolesch testen -> Prädikat
3. Parameter und Rückgabewert manipulieren -> Funktion
Java-Funktionsschnittstelle mit bis zu zwei Parametern:
Einzelparameter-Schnittstelle
Consumer
Predicate
Function
Zwei-Parameter-Schnittstelle
BiConsumer
BiPredicate
BiFunction
Für mehr als zwei müssen Sie die Funktionsschnittstelle wie folgt erstellen (Verbrauchertyp):
quelle
Eine andere Alternative, die nicht sicher ist, ob dies für Ihr spezielles Problem gilt, aber für einige möglicherweise zutreffend ist, ist die Verwendung
UnaryOperator
in der Bibliothek java.util.function. Wenn derselbe Typ zurückgegeben wird, den Sie angegeben haben, werden alle Variablen in einer Klasse zusammengefasst und als Parameter angegeben:Die Klasse, die Sie in diesem Fall haben
Person
, kann also zahlreiche Instanzvariablen haben und muss den Parameter Ihres Lambda-Ausdrucks nicht ändern.Für Interessenten habe ich Hinweise zur Verwendung der Bibliothek java.util.function geschrieben: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
quelle
Sie können auch die jOOL-Bibliothek verwenden - https://github.com/jOOQ/jOOL
Es wurden bereits Funktionsschnittstellen mit unterschiedlicher Anzahl von Parametern vorbereitet. Zum Beispiel könnten Sie
org.jooq.lambda.function.Function3
usw. vonFunction0
bis zu verwendenFunction16
.quelle