java8新特性-lambda表达式

关于lambda表示式,它的本质就是匿名内部类一种。

复习一下匿名内部类

使用场景:当类或接口类型作为参数传递时,可以直接使用匿名内部类方式创建对应的对象

匿名内部类的嵌套使用

参考这篇:https://blog.csdn.net/u013771764/article/details/82937903

使用Lambda表达式简化匿名内部类的书写,但Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。

能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。

@FunctionalInterface 检查是否是函数式接口

lambda表达式省略了接口名和函数名

public class Test {

    interface  Fun{
          void say();//接口中的抽象方法abstract 可以省略

    }
    public static void main(String[] args) {
        Test test = new Test();
        test.play();
//lambda表达式 Fun fun
= () -> System.out.println("3"); fun.say(); } public void play(){ //匿名内部类 Fun f=new Fun(){ @Override public void say() { System.out.println("f"); } }; f.say(); } }

上面是无参函数简写,如果是有参函数:

(参数列表)->{return 返回值}  

可以省略参数列表的类型 编译器可以统一识别参数值。

public class Test {

    interface  Fun{
          void say(int x,int y);//接口中的抽象方法abstract 可以省略

    }
    public static void main(String[] args) {
        Fun fun = (x,y) -> {
            x=x+y;
            y=2*x;
            System.out.println("x="+x+",y="+y);};
        fun.say(3,4);
    }

}

lambda中可以使用成员变量,局部变量,但是使用过局部变量以后,该局部变量就必须为final,所以不能再修改了。

(1)不需要声明参数类型,编译器可以统一识别参数值。
(2)一个参数无需定义圆括号,但多个参数需要定义圆括号。
(3)lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
(4)在lambda表达式不允许声明与全局变量相同的局部变量、参数

    public static void main(String[] args) {
        Test test = new Test();
        test.play();
        int a=3;
        Fun fun2 = () -> System.out.println(a+5);
        fun2.say();
        a=5;//编译会报错
    }

 

posted @ 2021-07-01 14:31  下饭  阅读(56)  评论(0编辑  收藏  举报