Java Lambda 表达式

js 中的 Lambda 表达式

actuator 执行器

target 目标方法

function Hand(func){
    func();
}

function Hammer(){
	console.log("use hammer");
}

Hand(Hammer);

Hand(function BigHammer(){
	console.log("this is big hammer");
});

Hand(()=>{
	console.log("this is my code");
});

在很多编程语言中,如 js 中函数(方法)是可以作为参数进行传递的,因此会出现在方法中执行参数中传入的方法。传入的方法可以使用一早就已经定义好的方法,也可以在执行方法时在传入参数的位置临时定义一个方法,这种方法可能会使代码阅读性下降和代码过于冗长。因为在方法传参时直接定义方法,这个方法又很多部分都没有意义,即可以省略不写,lambda 表达式就是为了解决这一问题出现的,它的本质就是一个语法糖。

如何在 java 中使用

js 中我们可以直接传递函数,但是在 java 中参数的传递全部都是值传递,无法传递函数。因此我们需要一种退而求其次的方法来实现类似于方法的传递,首先在 java 中我们是可以传递对象引用的,那我们传递一个对象到另一个对象的方法中,再让接收对象的方法去执行我们传递的对象中的方法,这时就可以实现类似函数传递相似的功能。

再次进一步进行思考,在 js 中需要传递的函数是需要在传递时直接去定义才可以使用 lambda 表达式,但是在 java 中需要传递的对象必须是已经定义好的对象,需要将指定的对象 new 出来然后再进行传递。如何解决这个问题,这时就需要用到接口,在代码中实例化一个接口的方法是这样的:

Hammer hammer = new Hammer(){
    @Override
    public void hammerNail() {}
};

可以在 new 的过程中编写方法中需要执行的代码,此时我们直接将这个 new 好的对象进行传递就完美解决了这个问题。

下面是整体代码:

执行类

public class Person {

    private Hammer myRunnable;

    public Person(Hammer myRunnable){
        this.myRunnable = myRunnable;
    }

    public Person hand(){
        if (myRunnable != null){
            myRunnable.hammerNail();
        }
        return this;
    }
}

接口类

public interface Hammer {

    void hammerNail();

}

测试类

public static void main(String[] args) {
    Person hammerNail = new Person(() -> {
        System.out.println("锤钉子");
    }).hand();
}

js 中不同的是,在 javalambda 表达式使用的是 ->js 使用的是 => ,其余的用法与 js 完全相同。

缩写格式

lambda 表达式在参数和执行代码不同的情况下也可以进行相应的缩写

无参数

new Person(() -> {});

一个参数

new Person((param) -> {});
new Person(param -> {});

多个参数

new Person((param1, param2, ...) -> {});

当执行的代码为一行

new Person(() -> System.out.println("锤钉子")); // 无返回值
new Person(() -> 1>2); // 有返回值,不用写 return 直接返回
上一篇:C++解PTA A1096Conse


下一篇:python基础5-变量/递归函数/函数式编程/内置函数