Почему лямбда-выражения являются объектами в Java? [дубликат]
Как объекты лямбда-выражений в Java? Как можно реализовать лямбда-выражения, которые являются частью функционального программирования, на Java, которая является объектно-ориентированным языком? Какие концепции Java необходимы для понимания лямбда-выражений?
Ответы
Вам нужно понять несколько вещей:
1) Функциональный интерфейс
- интерфейс, который имеет только один общедоступный метод
public interface Runnable{
void run();
}
- это пример функционального интерфейса, он может иметь разные виды методов, такие как int
processNumber(int number) - просто помните, что может быть только один метод (один не реализованный метод, значения по умолчанию не учитываются)
2) Использование функционального интерфейса
- вы можете реализовать свой функциональный интерфейс в своем классе, скажем MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- чем вы можете передать свой класс MyRunnable в другие методы, это просто обычный объект
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- это напечатает "Hello world"
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) Что делает лямбда
- так что лямбда позволяет вам создать анонимную реализацию интерфейса
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- это напечатает "Hello my world"
- вы просто создаете анонимную реализацию Runnable и передаете ее MyMethod
- это просто синтаксический сахар для этого
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Лямбда в Java - это просто функциональный интерфейс . В основном это синтаксический сахар .
Java не является функциональным языком и, как таковой, не может полностью реализовать функциональное программирование, это только подмножество его основных принципов. Например, вы не можете реализовать правильные классы типов в Java .
В любом случае нет стандартного определения FP, как нет стандартного определения для ООП. Конкретное определение может варьироваться в зависимости от источников, но общие идеи (обычно) одинаковы.
Java - объектно-ориентированный язык. Но некоторые функции функциональных языков также доступны в java, например lambda.
лямбда - это в основном объект, который действует как функция. документация :https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
как обычно функция имеет вход и выход
входы в функциях: обозначаются T (как в дублях)
выходы в функции: обозначены как R (как в возврате)
структура объявления: Function<T,R> var_name = input_variables -> output_expression
пример : Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
или есть другой способ (также известный как ссылка на метод)
это фактически доступ к методу под капотом
Function<T,R> var_name = class_name :: method_name
пример : Function<Double,Double>Tanh = Math::tanh
Использование функции
Чтобы использовать функцию, вам просто нужно вызвать apply(T t)метод класса функции
пример : double num = sigmoid.apply(0)