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函数式将函数
作为参数传递的强力写法。