Java新特性之Java8的那些事儿-Lambda 表达式
Lambda 表达式,也可称为闭包(相当于一个函数 参考链接:https://baike.baidu.com/item/%E9%97%AD%E5%8C%85/10908873?fr=aladdin),它是推动 Java 8 发布的最重要新特性。 Java8中使用Lambda 这一新特性允许程序把函数作为一个方法的参数(函数作为参数传递进方法中),从而使的代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
对于以上语法重要特性如下:
-
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
-
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
-
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda 表达式的简单例子:
// 不需要参数,返回值为 1024
() -> 1024
// 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 接收一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
Lambda 在代码中的体现
为了更好的理解Lambda 表达式的使用,我们定义一个用于运算的接口IMathOperation 接口(上文默认方法中已定义)。
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
}
/**
* 定义静态默认方法
*/
static void version(){
System.out.println("这是1.0版简易计算器");
}
/**
* 整数加法运算方法
* @param a
* @param b
* @return
*/
public int add(int a,int b);
}
在程序中使用接口时 Java8以前我们的代码可能是这样(通过匿名实现类 调用接口方法实现加操作):
public static void main(String[] args) {
/**
* 匿名实现IMathOperation add 方法
*/
IMathOperation m01=new IMathOperation() {
@Override
public int add(int a, int b) {
return a+b;
}
};
// 调用接口实例方法 实现加法操作
System.out.println(m01.add(1024, 1024));
}
现在使用 Lambda 表达式,代码就会变得简化很多:
/**
* 使用Lambda 表达式 实现接口add 方法
*/
IMathOperation m02 = (a,b)->a+b;
System.out.println(m02.add(1024 ,1024));
这里 可以看到 对于 (a,b)->a+b 这块代码 就是上面提到的Lambda ,它的作用实际上与Java8以前的匿名实现类的代码功能是一样的,但是在不影响功能代码的情况下却比上面的代码简化了很多,此时的(a,b)->a+b 就相当于 add 接口的匿名实现。
Lambda 变量作用域
Lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。 这也是符合Java的规范的,对于匿名类实现的接口方法在引用外部变量时,此时的外部变量是不可修改的。
final static Integer a2=512;
final static Integer b2=1024;
public static void main(String[] args) {
IMathOperation m03=(a,b)->a+b;
m03.add(a2,b2);
}