Em Java, é possível que um lambda aceite vários tipos diferentes?
Ou seja: Variável única funciona:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs também 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 })));
Mas eu quero algo que possa aceitar muitos tipos diferentes de argumentos, por exemplo:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
O uso principal é ter pequenas funções embutidas dentro das funções por conveniência.
Eu olhei em volta do google e inspecionei o pacote de funções do Java, mas não consegui encontrar. Isso é possível?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
qual os confrontos comjava.util.function.Function<T,R>
isso podem não ser claros para os iniciantes.Para algo com 2 parâmetros, você pode usar
BiFunction
. Se precisar de mais, você pode definir sua própria interface de funções, assim:Se houver mais de um parâmetro, você precisará colocar parênteses em torno da lista de argumentos, assim:
fonte
Nesse caso, você pode usar interfaces da biblioteca padrão (java 1.8):
Há um pequeno (não o melhor) exemplo de método padrão na interface:
fonte
Para fazer uso do lambda: Existem três tipos de operação:
1. Aceite o parâmetro -> Consumidor
2. Teste o parâmetro return boolean -> Predicate
3. Manipule o parâmetro e retorne o valor -> Function
Interface funcional Java até dois parâmetros:
Interface de parâmetro único Função de predicado do
consumidor Interface de dois parâmetros BiConsumer BiPredicate BiFunction
Por mais de dois , você deve criar uma interface funcional da seguinte maneira (tipo Consumidor):
fonte
Outra alternativa, não tenho certeza se isso se aplica ao seu problema específico, mas a alguns pode ser aplicável, é usar
UnaryOperator
na biblioteca java.util.function. onde ele retorna o mesmo tipo que você especificar, então você coloca todas as suas variáveis em uma classe e é como um parâmetro:Portanto, a classe que você possui, nesse caso
Person
, pode ter inúmeras variáveis de instância e não precisará alterar o parâmetro da sua expressão lambda.Para os interessados, escrevi notas sobre como usar a biblioteca java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
fonte
Você também pode usar a biblioteca jOOL - https://github.com/jOOQ/jOOL
Já preparou interfaces de função com diferentes números de parâmetros. Por exemplo, você pode usar
org.jooq.lambda.function.Function3
etc, deFunction0
atéFunction16
.fonte