En Java, est-il possible qu'un lambda accepte plusieurs types différents?
Ie: Fonctionne à une seule variable:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs fonctionnent également:
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 })));
Mais je veux quelque chose qui puisse accepter de nombreux types d'arguments différents, par exemple:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
L'utilisation principale est d'avoir de petites fonctions en ligne à l'intérieur des fonctions pour plus de commodité.
J'ai regardé autour de Google et inspecté le package de fonctions de Java, mais je n'ai pas trouvé. Est-ce possible?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
duquel des conflits avecjava.util.function.Function<T,R>
qui pourraient ne pas être clairs pour les débutants.Pour quelque chose avec 2 paramètres, vous pouvez utiliser
BiFunction
. Si vous avez besoin de plus, vous pouvez définir votre propre interface de fonction, comme ceci:S'il y a plus d'un paramètre, vous devez mettre des parenthèses autour de la liste d'arguments, comme ceci:
la source
Dans ce cas, vous pouvez utiliser les interfaces de la bibliothèque par défaut (java 1.8):
Il existe un petit (pas le meilleur) exemple de méthode par défaut dans l'interface:
la source
Pour utiliser lambda: Il existe trois types d'opérations:
1. Accepter le paramètre -> Consommateur
2. Test du paramètre return boolean -> Predicate
3. Manipuler le paramètre et renvoyer la valeur -> Fonction
Interface fonctionnelle Java jusqu'à deux paramètres:
Interface à paramètre unique Fonction de prédicat
consommateur Interface à deux paramètres BiConsumer BiPredicate BiFunction
Pour plus de deux , vous devez créer une interface fonctionnelle comme suit (type consommateur):
la source
Une autre alternative, vous ne savez pas si cela s'applique à votre problème particulier, mais à certains, cela peut être applicable est de l'utiliser
UnaryOperator
dans la bibliothèque java.util.function. où il retourne le même type que vous spécifiez, donc vous mettez toutes vos variables dans une classe et est-ce en tant que paramètre:Ainsi, la classe que vous avez, dans ce cas
Person
, peut avoir de nombreuses variables d'instance et n'aura pas à changer le paramètre de votre expression lambda.Pour les personnes intéressées, j'ai écrit des notes sur l'utilisation de la bibliothèque java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
la source
Vous pouvez également utiliser la bibliothèque jOOL - https://github.com/jOOQ/jOOL
Il a déjà préparé des interfaces de fonction avec un nombre différent de paramètres. Par exemple, vous pouvez utiliser
org.jooq.lambda.function.Function3
, etc. deFunction0
jusqu'àFunction16
.la source