En Java, ¿es posible que una lambda acepte múltiples tipos diferentes?
Es decir: la variable única funciona:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs también funciona:
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 })));
Pero quiero algo que pueda aceptar muchos tipos diferentes de argumentos, por ejemplo:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
El uso principal es tener pequeñas funciones en línea dentro de las funciones para mayor comodidad.
Revisé google e inspeccioné el paquete de funciones de Java, pero no pude encontrarlo. es posible?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
cual los choques conjava.util.function.Function<T,R>
eso podrían no estar claros para los principiantes.Para algo con 2 parámetros, podría usar
BiFunction
. Si necesita más, puede definir su propia interfaz de función, así:Si hay más de un parámetro, debe poner paréntesis alrededor de la lista de argumentos, así:
fuente
Para este caso, podría usar interfaces de la biblioteca predeterminada (java 1.8):
Hay un pequeño (no el mejor) ejemplo de método predeterminado en la interfaz:
fuente
Para hacer uso de lambda: Hay tres tipos de operaciones:
1. Aceptar parámetro -> Consumidor
2. Probar parámetro retorno booleano -> Predicar
3. Manipular parámetro y valor de retorno -> Función
Interfaz funcional Java hasta dos parámetros:
interfaz de un solo parámetro Función de predicado del
consumidor Interfaz de dos parámetros BiConsumer BiPredicate BiFunction
Para más de dos , debe crear una interfaz funcional de la siguiente manera (tipo de consumidor):
fuente
Otra alternativa, no estoy seguro si esto se aplica a su problema particular, pero para algunos puede ser aplicable es usarlo
UnaryOperator
en la biblioteca java.util.function. donde devuelve el mismo tipo que especifique, por lo que coloca todas sus variables en una clase y es como un parámetro:Entonces, la clase que tiene, en este caso
Person
, puede tener numerosas variables de instancia y no tendrá que cambiar el parámetro de su expresión lambda.Para aquellos interesados, he escrito notas sobre cómo usar la biblioteca java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
fuente
También puede usar la biblioteca jOOL: https://github.com/jOOQ/jOOL
Ya ha preparado interfaces de funciones con diferentes números de parámetros. Por ejemplo, puede usar
org.jooq.lambda.function.Function3
, etc. deFunction0
hastaFunction16
.fuente