Lambda表达式及应用

Lambda表达式

概念

语法形式: () -> {}
组成:

  1. 括号:表示参数列表;
  2. 箭头:表示lambda运算符,读作goes to;
  3. 花括号:表示方法体。

参数列表相关概念:

参数个数:
无参数,或者,1个或多个;
另外,只有一个参数时括号可以省略。

参数的类型:
一般不定义参数类型,由编译器推理得到,或者特殊情况下,可以自己指定这些参数的类型。

方法体:
方法体中可以放参数相关的多句执行语句,也可以有return语句,当代码语句只有一句时,花括号可以省略。不在方法体中定义新的方法。有待考证*1

应用

在forEach()方法使用
Arrays.asList(1, 2, 3, 4, 5).forEach(x -> System.out.println(x));
用来替代匿名内部类

1、继承式匿名内部类如下:

new “类名”(){}

Lambda表达式代替:无法替代。有待考证*2
匿名内部类的花括号内是空的,对应Lambda表达式花括号内也是空的,但会【报错】Not a statement。说明不能是空的,得有执行语句。

2、接口式匿名内部类如下:

new “接口名”(){
	//重写这个父类“接口名”的一些或全部方法
	public 返回类型 方法名(参数类型 参数){
		//代码执行语句
	}
}

Lambda表达式代替:

  1. 当接口只有一个方法时,重写方法只有一个时,Lambda表达式可以成功代替。
(参数)->{
	//重写方法对应的代码执行语句
}
  1. 当接口只有多个方法时,即重写方法有多个时,Lambda表达式无法按上述1中格式:把每个重写方法的执行语句写上。
    【报错】:Multiple non-overriding abstract methods found in interface test.CarFun。

有待考证*3:是不是我不知道接口多个方法时,Lambda表达式的替换接口式匿名内部类的方法。

代码验证(Lambda表达式替代匿名内部类)

代码示例:

接口CarFun.java:
在这里插入图片描述

main函数验证:Test.java

下图在main函数下写了接口式匿名内部类。并用zerocarfun调用了drive()和stop()方法。接下来要写一个Lambda表达式替换它。
在这里插入图片描述

  1. Lambda表达式只重写一个方法drive()情况下:
    在这里插入图片描述
    对应上图,替换成Lambda表达式后,执行代码结果:
zero开车了,已经开了0.7928757329649554千米

说明替换成功了。

  1. Lambda表达式重写drive()和stop()多个方法情况下:
    先打开CarFun中第5行代码注释。
    在这里插入图片描述
    CarFun接口添加stop()方法后。【报错】:在CarFun接口中找到多个非重写的抽象方法。

在这里插入图片描述

在Lambda表达式里添加stop()方法的执行语句:

System.out.println("zero停车了");

在这里插入图片描述
仍然【报错】:在CarFun接口中找到多个非重写的抽象方法。

不知道如何用Lambda表达式替代,有多个方法的接口式匿名内部类。

考证*3
百度一下报错信息。
知道:@FunctionalInterface会告诉编译器可以用Lambda表达式。
我很好奇这个是什么注解?我在接口上写了这个注解。
也【报错】:在CarFun接口中找到多个非重写的抽象方法。

我点进源码,查看了这个注解的概述。猜猜我发现了什么?我发现了一个关键句子:

Conceptually, a functional interface has exactly one abstract method.

从概念讲,一个functional interface有且仅有一个抽象方法。

进一步百度functional interface。
发现这个是函数式接口的意思。
结合上面百度到的:@FunctionalInterface会告诉编译器可以用Lambda表达式。

说明:Lambda表达式替换接口式匿名内部类时,这个匿名内部类相对应的接口只能有一个抽象方法。

结论:Lambda表达式替代接口式匿名内部类时,相对应的接口是一个函数式接口。

进一步,查看Predicate源码时发现,函数式接口只有一个抽象方法,但可以有多个default修饰的非抽象的方法,或者非抽象的静态方法。

考证*2
进一步百度,了解,Lambda表达式替代匿名内部类,指就是上述结论中的情况,替代接口式匿名内部类,不是替代继承式匿名内部类。

考证*1
从替代接口式匿名内部类角度看:花括号方法体中不定义新的方法,也不写方法名,直接写重写的代码执行语句即可。

有待进一步考证*1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值