一、Lambda表达式
例如:新建一个线程输出一句话
使用匿名内部类完成此操作
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("启动线程");
    }
}).start();
匿名内部类操作分析:
1.方法形式参数为空,说明调用方法时不需要传递参数
2.方法返回值类型为void,说明方法执行没有结果返回
3.方法体中的内容,是我们具体要做的事情
使用Lambda表达式
new Thread(()->{  System.out.println("启动线程"); }).start();
Lambda表达式分析:
1.():里面没有内容,可以看作是方法形式参数为空,
2.->:用箭头指向后面要做的事情
3.{}:包含一段代码,我们称之为代码块,可以看作方法体中的内容
由此可见,组成Lambda表达式的三要素:形式参数、箭头、代码块
二、Lambda表达式标准格式
格式:
1.标准格式:(形式参数)->{代码块}
2.形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可
2.->:由英文中画线和大于号组成,固定写法,代表指向动作
3.代码块:是我们具体要做的事情,也就是之前的方法体内容
三、Lambda表达式的使用前提
1.有一个接口
2.接口中有且仅有一个抽象方法
四、Lambda表达式练习(抽象方法无参无返回值)
练习一(抽象方法无参无返回值):
1.定义一个接口(Eat),接口中定义一个抽象方法:void eat()
2.定义一个测试类,在测试类中提供两个方法
方法一:useEat(Eat e)
方法二:主方法,调用useEat方法
接口
package Demo042202;
public interface Eat {
    void eat();
}
package Demo042202;
public class EatDemo {
    public static void main(String[] args) {
        //使用Lambda表达式来实现方法的调用
        useEat(()->{
            System.out.println("最美不过姑娘你");
        });
    }
    //定义一个方法
    private static void useEat(Eat e){
        e.eat();
    }
}
于之前实现接口以及使用匿名内部类的方式对比来说简洁了不少
练习二(抽象方法带参无返回值):
1.定义一个接口(Flyable),接口中定义一个抽象方法:void fiy(String s)
2.定义一个测试类(FlyableDemo),在测试类中提供两个方法
方法一:useFlyable(Flyable f)
方法二:主方法,调用useFlyable方法
接口
package Demo042203;
public interface Flyable {
    void fly(String s);
}
package Demo042203;
public class FlyableDemo {
    public static void main(String[] args) {
        useFly((String s)->{
            System.out.println(s+"飞翔");
        });
    }
    private static void useFly(Flyable f){
        f.fly("小鸟");
    }
}
练习三(抽象方法带参带返回值):
1.定义一个接口(Addable),接口中定义一个抽象方法:void add(int a,int b)
2.定义一个测试类(AddableDemo),在测试类中提供两个方法
方法一:useAddable(Addable a)
方法二:主方法,调用useAddable方法
接口
package Demo042204;
public interface Addable {
    int add(int a,int b);
}
public class AddableDemo {
    public static void main(String[] args) {
        useAddable((int a, int b) -> {
            return a + b;
        });
    }
    private static void useAddable(Addable a) {
       int sum= a.add(10,20);
        System.out.println(sum);
    }
}
四、Lambda表达式的省略模式
省略规则:
1.参数类型可以省略,但是有多个参数的情况下,不能只省略一个
例如练习二中的Lambda表达式可以这样写
useFly( s-> System.out.println(s+"飞翔") );
2.如果参数有且仅有一个,那么小括号可以省略
例如练习二中的Lambda表达式可以这样写
useFly( s-> System.out.println(s+"飞翔") );
3.如果代码块的语句只有一条,可以省略大括号和分号,甚至是return都可以省略
例如练习三中的Lambda表达式可以这样写
useAddable(( a,b)->a + b);
五、Lambda表达式的注意事项
注意事项:
1.使用Lambda必须要有接口,并且要求接口中只能有且仅有一个抽象方法
2.必须要有上下文环境,才能推导出Lambda对应的接口
根据局部变量的赋值得知Lambda对应的接口:Runnable r=()->System.out.println("最美不过姑娘你") ;
根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.println(最美不过姑娘你)).start();
六、Lambda表达式和匿名内部类的区别
1.所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
2.使用限制不同
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3.实现原理不同
匿名内部类:编译后,产生一个单独的.class字节码文件
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号