【问题标题】:How come lambda expressions are objects in Java? [duplicate]lambda 表达式为什么是 Java 中的对象? [复制]
【发布时间】:2020-11-06 10:45:42
【问题描述】:

Java 中的 lambda 表达式对象是怎样的?作为函数式编程的一部分的 lambda 表达式如何在 Java 中实现,Java 是一种面向对象的语言?理解 lambda 表达式需要哪些 Java 概念?

【问题讨论】:

    标签: java lambda


    【解决方案1】:

    你需要了解几件事:

    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) lambda 在做什么

    • 那么 lambda 让你做的就是创建接口的匿名实现
    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");
            });
    }
    

    【讨论】:

      【解决方案2】:

      A lambda in Java is basically just a functional interface。主要是syntactic sugar

      Java 不是一种函数式语言,因此它不能完全实现函数式编程,只能实现其核心原则的一个子集。例如you can't implement proper typeclasses in Java

      无论如何,FP 没有标准定义,就像 OOP 没有标准定义一样。具体定义可能因来源而异,但总体思路(通常)是相同的。

      【讨论】:

        【解决方案3】:

        Java 是一种面向对象的语言。但是函数式语言的一些特性也可以在 java 中使用,比如 lambda

        lambda 基本上是一个像函数一样工作的对象。 文档:https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

        像往常一样,函数有一个输入和一个输出

        函数中的输入:称为 T(as in take)

        函数中的输出:称为 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)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-20
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多