Lambda表达式的语法:
(parameters) -> expression 或 (parameters) ->{ statements; }
- parameters:表示参数列表;
- ->:可理解为“被用于”的意思;
- expression:表示一条语句;
- statements:表示多条语句。
Lambda可以理解为:Lambda就是匿名内部类的简化。
lambda表达式可以通过表达式来代替功能接口,而这个接口必须是函数式接口。
lambda的本质就是函数式接口。
此时你可能根本没明白我在说啥,你可以先忘掉,因为这些只是让你有一个简单的印象。
函数式接口
函数式接口其实就是一个只定义了一个抽象方法的接口,可以使用 @FunctionalInterface 注解。
例如这就是一个函数式接口。
interfaceA{ voidprint(); }
注:是只定义一个抽象方法的接口
例如它也是函数式接口。
interfaceA{ voidprint();//只定义了这一个抽象方法staticvoidbb(){} defaultvoidcc(){} }
此时函数式接口已经了解完了这时再看这句话:
- Lambda可以理解为:Lambda就是匿名内部类的简化。
- lambda表达式可以通过表达式来代替功能接口,而这个接口必须是函数式接口。
Lambda表达式的使用
要想使用Lambda表达式就必须要有一个函数式接口。
interfaceA{ voidprint();//无参无返回值的打印方法}
因为Lambda表达式是匿名内部类的简化版所以我们可以先使用匿名内部类来调用一下这个方法
publicstaticvoidmain(String[] args) { Aa=newA(){ publicvoidprint(){ System.out.println("hello"); } }; a.print(); }
此时编译器其实已经提示此处可以使用 Lambda 表达式了。
按照提示按下快捷键后就变成了这样:
对应关系是这样的(此时如果不理解可以跳转到文章开头):
//接收一个参数(数字类型),返回其2倍的值(intx) -> {returnx*2;}; //或者简写x->x*2; //接受2个参数(数字),并返回他们的和(intx, inty) -> {returnx*2;}; //或者简写(x, y) ->x+y;
注:当有多个参数时就算每个参数类型不相同也能省略参数。
Lambda的变量捕获
所谓的变量捕获其实就是把当前作用域中的变量在Lambda表达式内部复制了一份,此时外面的变量是否销毁就无所谓了。
Lambda表达式里面的代码是可以自动捕获到上层区域中涉及到的局部变量
只能捕获常量或者是没有改变过值的变量。
此时的 f 必须没有改变过值,就算在表达式内部或下面都不行。
如果将变量写到方法的往外面变成成员变量就可以不受上述限制,但此时就不是变量捕获的语法了,而是变成了内部类访问外部类的语法了。
此处变量用 static 修饰完全是因为 main 方法是用 static 修饰的。