Java lambda表达式

lambda表达式

lambda表达式是一种只拥有一个函数式接口的方法的叫法,可以简化封装。

函数式接口

在lisp这样的函数式编辑语言中,可以简单地把函数当作参数传递。在java中,由于函数不是对象,故不能直接当作参数传递。但可以通过函数式接口实现函数传递。

package foo;

public interface Func {
    public double apply(double x);
}

ps. 函数式接口只拥有一个抽象方法的接口

函数式接口的封装

  • 截止java7,对抽象方法进行override
Func g = new Func(){
    @Override
    public double apply(double x) {
        return x * x;
    }
};
  • 在java8,上面的代码可以简写成如下
Func f = x -> x * x;

或者

Func f = (x) -> {return x * x;};

基本写法 (参数1, 参数2, …) -> {处理1; 处理2; …}
可以不传递参数,空处理也可以写成 () -> {}

通过函数式接口可以将原来override的方法简单地实现出来。

下面让我们通过例子来了解函数式接口的真正威力。

package foo;

public class FuncUser {
    public static void samplePrintFunc(Func f) {
        for(double x = 1.0; x <= 3.0; x += 1.0) {
            System.out.println(f.apply(x));
        }
    }
}

可以简单写成

FuncUser.samplePrintFunc(x -> x * x);

也可以换成别的处理逻辑

FuncUser.samplePrintFunc(x -> Math.sin(x));

稍微复杂的逻辑时

FuncUser.samplePrintFunc(x -> { a = Math.sin(x); b = Math.cos(x); return a * b; });

当函数式接口的参数类型和方法的参数相同时,连参数也可以省略掉,简写如下

原: FuncUser.samplePrintFunc(x -> Math.sin(x));
简写后: FuncUser.samplePrintFunc(Math::sin);

以上就是lambda函数式将函数作为参数传递的强力写法。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注