美文网首页
Java新特性之Java8的那些事儿-Lambda 表达式

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

作者: I_Jesus | 来源:发表于2019-03-23 11:23 被阅读0次

    ​ 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);
    }
    

    相关文章

      网友评论

          本文标题:Java新特性之Java8的那些事儿-Lambda 表达式

          本文链接:https://www.haomeiwen.com/subject/ygnjvqtx.html