zoukankan      html  css  js  c++  java
  • JAVA8新特性——Lamda表达式

      JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~

      Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类。

      先来看看传统的匿名内部类调用方式:

    interface MyInterface{
    
        void lMethod();
    }
    public class Main {
    
        public static void test(MyInterface myInterface){
            myInterface.lMethod();
        }
    
        public static void main(String[] args) {
            test(new MyInterface() {
                @Override
                public void lMethod() {
                    System.out.println("Hello World!");
                }
            });
        }
    }

      在主类中的这么几行代码,嵌套几层就为了输出一个Hello World!是不是很麻烦?但是由于java结构的完整性,我们还不得不那么做,现在JDK1.8来了。

      再来看看使用Lamda表达式改写上面的代码:

    interface MyInterface{
    
        void lMethod();
    }
    public class Main {
    
        public static void test(MyInterface myInterface){
            myInterface.lMethod();
        }
    
        public static void main(String[] args) {
            test(()->System.out.println("Hello World!"));
        }
    }

      这就是Lamda表达式语言,为了解决匿名内部类繁杂的操作而出现。

    Lamda语法有三种形式:

    • (参数) ->单行语句;
    • (参数) ->{多行语句};
    • (参数) ->表达式;

      括号()可以大致理解为就是方法,里面是参数变量,在上面的例子中()->System.out.println("Hello World!") 前面的()代表void lMethod()方法,它没有入参,所以为空,->后面是一个单行语句;

      如果->后面是多行语句,需要用{ }装起来,每条语句后需要有分号;

      ->后面也可以是一个表达式,如:a+b等。

    (参数) ->单行语句:

    interface MyInterface{
    
        void lMethod(String str);
    }
    public class Main {
    
        public static void test(MyInterface myInterface){
            myInterface.lMethod("Hello World!");//设置参数内容
        }
    
        public static void main(String[] args) {
            //首先在()中定义此表达式里面需要接收变量s,后面的单行语句中就可以使用该变量了
            test((s)->System.out.println(s));
        }
    }

    (参数) ->{多行语句}:

    interface MyInterface{
    
        void lMethod(String str);
    }
    public class Main {
    
        public static void test(MyInterface myInterface){
            myInterface.lMethod("Hello World!");//设置参数内容
        }
    
        public static void main(String[] args) {
            //首先在()中定义此表达式里面需要接收变量s,后面的多行语句中就可以使用该变量了。注意:多行语句别少“;”号
            test((s)->{
                s=s+s;
                System.out.println(s);
            });
        }
    }

    (参数) ->表达式:

    interface MyInterface{
    
        int lMethod(int a,int b);
    }
    public class Main {
    
        public static void test(MyInterface myInterface){
            int result=myInterface.lMethod(1,2);//设置参数内容,接收返回参数
            System.out.println(result);
        }
        public static void main(String[] args) {
    
            test((x,y)-> x*y );//调用方法
            //相当于
    //        test((x,y)-> {return  x*y;});
        }
    }

      这样,Lamda表达式就看起来很简单了,有不有!

      匿名内部类,我们比较常用的地方在哪儿?线程类Thread,以前我们可能这样写:

    new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("线程操作!");
    }
    });

      现在,使用Lamda表达式,简单写为:

    new Thread(()->System.out.println("线程操作!"));

      

      总结:利用Lamda表达式是为了避免匿名内部类定义过多无用的操作。

      

  • 相关阅读:
    CSS盒模型
    js异步加载——defer和async的区别
    href和src的区别
    JS中Null与Undefined的区别
    浅谈Web Workers
    flex布局学习笔记
    Promise
    js数组类型检测
    JavaScript中的遍历
    Autocomplete
  • 原文地址:https://www.cnblogs.com/hyyq/p/7425666.html
Copyright © 2011-2022 走看看