Lambda表达式

527 阅读3分钟

1:Lambda表达式概述

什么是Lambda表达式?

可以将Lambda表达式理解为一个匿名函数; Lambda表达式允许将一个函数作为另外一个函数的参数; 我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。

Lambda表达式可以显著提高我们的编程效率

2:Lambda的具体使用

    //实现类的方式的实现需求
        MyRunnable my = new MyRunnable();
        Thread t = new Thread(my);
        t.start();
//使用匿名内部类的方法改进
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("多线程程序启动了");
    }
}).start();

//Lambda表达式改进
        new Thread(()->{
            System.out.println("jinitaimei");
        }).start();

是不是很妙?上诉代码是为了实现Runnable,如果使用常规的方法改进,就得使用匿名内部类的方式改进,但如果使用Lambda表达式,则大幅度简化了所需的代码数,且更易理解。

3:详解

Lambda表达式的格式

格式:(形式参数) -> {代码块}

形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可。

->:由英文中画线和大于符号组成,固定写法。代表指向动作

代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

4:Lambda表达式的省略模式

省略规则:
①参数类型可以省略。但是有多个参数的情况下,不能只省略一个
②如果参数有且仅有一个,那么小括号可以省略
③如果代码块的语句只有一条,可以省略大括号和分号,甚至是return

useix((int x,int y)->{
//            return  x+y;
         return x-y;
     });
//类型的省略
     useix((x,y)->{
         return x+y;
     });

//
     useflyable(s -> {
         System.out.println(s);
     });
//      参数有且只有一个大括号和分号
     useflyable(s -> System.out.println(s));
//如果有return,return也要省略掉
     useix((x,y)->x+y);

 }
 private  static void useix (ix a){
     int sum=a.add(10,36);
     System.out.println(sum);
 }
 private static void useflyable(ip s) {
     s.fly("风和日丽");
 }

5:Lambda表达式的注意事项

注意事项:

①使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

②必须有上下文环境,才能推导出Lambda对应的接口

public static void main(String[] args) {
//
     useinter(() ->
             System.out.println("jinitaimei"));


//    必须有上下文环境,才能推到出Lambda对应的接口
 new Thread(new Runnable() {
     @Override
     public void run() {
         System.out.println("匿名内部类");
     }
 }).start();


}
 private static void useinter(inter i) {
     i.show();
 }
}
//使用lambda必须要有接口,并且要求接口中有且只有一个抽象方法

6:Lambda表达式和匿名内部类的区别

- 所需类型不同  
1:匿名内部类:可以是接口,也可以是抽象类,还可以是具体类  
2:Lambda表达式:只能是接口

-   使用限制不同  
1:如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类  
2:如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
-   实现原理不同
1:匿名内部类:编译之后,产生一个单独的.class字节码文件
2:Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成