【Java】lambda表达式的3种写法
lambda表达式:
简单来说,可以看成是对匿名内部类的简写。使用Lambda表达式时,接口必须是函数式接口
基本语法:
<函数式接口> <变量名> = (参数1,参数2...) -> {
//方法体
}
lambda表达式:简化版
特点说明:
(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;
下述是3个案例讲述lambda表达式对匿名内部类的简化
第一种写法:有参数无返回值
package cn.meituan.lambdaHasArgsAndNoReturn;/*** 有参无返回值测试类* /*** lambda表达式简化版* 1.参数只需要名字,不需要类型,会自动推断类型* 2.参数只有一个省略小括号,没有参数小括号不能省略* 3.lambda体(方法体)中只有一句话,省略掉{}* 4.lambda体(方法体)中只有一句话,如果是return,{}省略,而且return也要省略。*/
public class HasArgsAndNoReturnTest {public static void main(String[] args) {// 1.采用匿名内部类方式 接口代替实现类对象MyInterface my = new MyInterface() {@Overridepublic void sum(int a, int b) {//实例方法(非static修饰)// 没有返回值就直接进行输出System.out.println(a + b);}};// 2.采用lambda表达式 简化版/*** lambda表达式简化版* 1.参数只需要名字,不需要类型,会自动推断类型* 2.参数只有一个省略小括号,没有参数小括号不能省略* 3.lambda体(方法体)中只有一句话,省略掉{}* 4.lambda体(方法体)中只有一句话,如果是return,{}省略,而且return也要省略。*/MyInterface my1 = ( a, b) -> System.out.println(a + b);// 调用方法 接口名方法名// 非static修饰 对象名(接口对象名).方法名my.sum(5, 6);my1.sum(5, 6);}
}
第二种写法:有参数有返回值
package cn.meituan.lambdaHasArgsAndReturn;/*** 测试类* 有参有返回值测试类* * @author Mixi**/
public class HasArgsAndReturnTest {public static void main(String[] args) {// 1.采用匿名内部类方式 MyInterface my1 = new MyInterface() {@Overridepublic int sum(int a, int b) {return a+b;}};// 2.采用lambda表达式:简化版MyInterface my2 =(a,b) -> a+b;//调用方法 接口名方法名System.out.println("两个数和为:"+my1.sum(5, 10)); System.out.println("两个数和为:"+my2.sum(5, 20)); }
}
第三种写法:无参无返回值测试类
package cn.meituan.lambdaNoArgsAndNoReturn;/*** 无参无返回值测试类* @author Mixi**/
public class NoArgsAndNoReturnTest {public static void main(String[] args) {// 1.采用匿名内部类方式MyInterface my = new MyInterface() {// 重写抽象父类中的抽象方法@Overridepublic void speaking() {System.out.println("每个人从小就要学说话");}};// 2.采用lambda表达式 简化版MyInterface my1 = ()-> System.out.println("每个人从小就要动作");// 调用方法 接口名.方法名my.speaking();my1.speaking(); }
}