Java新特性之Java8的那些事儿-Lambda 表达式

2019-03-23  本文已影响0人  I_Jesus

​ 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);
}
上一篇下一篇

猜你喜欢

热点阅读