Почему лямбда-выражения являются объектами в Java? [дубликат]

Nov 06 2020

Как объекты лямбда-выражений в Java? Как можно реализовать лямбда-выражения, которые являются частью функционального программирования, на Java, которая является объектно-ориентированным языком? Какие концепции Java необходимы для понимания лямбда-выражений?

Ответы

2 JakubZnamenáček Nov 06 2020 at 19:17

Вам нужно понять несколько вещей:

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");
        });
}
1 m0skit0 Nov 06 2020 at 17:50

Лямбда в Java - это просто функциональный интерфейс . В основном это синтаксический сахар .

Java не является функциональным языком и, как таковой, не может полностью реализовать функциональное программирование, это только подмножество его основных принципов. Например, вы не можете реализовать правильные классы типов в Java .

В любом случае нет стандартного определения FP, как нет стандартного определения для ООП. Конкретное определение может варьироваться в зависимости от источников, но общие идеи (обычно) одинаковы.

Coder Nov 06 2020 at 19:04

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)