Por que as expressões lambda são objetos em Java? [duplicado]
Como são os objetos de expressões lambda em Java? Como as expressões lambda, que fazem parte da programação funcional, podem ser implementadas em Java, que é uma linguagem orientada a objetos? Quais conceitos Java eu preciso para entender as expressões lambda?
Respostas
Você precisa entender algumas coisas:
1) Interface funcional
- interface que tem apenas um método público
public interface Runnable{
void run();
}
- este é um exemplo de interface funcional, pode ter diferentes tipos de métodos, como int
processNumber(int number) - apenas lembre-se de que pode haver apenas um método (um método não implementado, os padrões não contam)
2) Usando interface funcional
- você pode implementar sua interface funcional em sua classe, digamos MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- do que você pode passar sua classe MyRunnable em outros métodos, seu objeto apenas normal
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- isso imprimiria "Olá, mundo"
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) O que lambda está fazendo
- então o que lambda permite que você crie uma implementação anônima de interface
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- isso imprimiria "Olá meu mundo"
- você está apenas criando uma implementação anônima de Runnable e passando-a para MyMethod
- é apenas açúcar sintático para isso
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Um lambda em Java é basicamente apenas uma interface funcional . É principalmente açúcar sintático .
Java não é uma linguagem funcional e, como tal, não pode implementar totalmente a programação funcional, apenas um subconjunto de seus princípios básicos. Por exemplo, você não pode implementar typeclasses adequadas em Java .
Em qualquer caso, não existe uma definição padrão para FP, da mesma forma que não existe uma definição padrão para OOP. A definição específica pode variar dependendo das fontes, mas as idéias gerais são (geralmente) as mesmas.
Java é uma linguagem orientada a objetos. Mas alguns recursos de linguagens funcionais também estão disponíveis em java, como lambda
lambda é basicamente um objeto que atua como uma função. documentação:https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
como de costume, uma função tem uma entrada e uma saída
entradas em funções: referido como T (como em take)
saídas em função: referido como R (como em retorno)
estrutura da declaração: Function<T,R> var_name = input_variables -> output_expression
exemplo: Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
ou existe outra forma (também conhecida como referência de método)
isso é, na verdade, acessar o método por baixo do capô
Function<T,R> var_name = class_name :: method_name
exemplo: Function<Double,Double>Tanh = Math::tanh
Usando uma função
Para usar uma função você só precisa chamar o apply(T t)método da classe de função
exemplo: double num = sigmoid.apply(0)