Lambda表达式
2023-03-31 10:40:58 时间
函数式思想
尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式去做。
Lambda表达式
就是函数是思想的体现
案例1
这是一段多线程要执行的内容:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("今天晚上真冷啊");
}
}
这是测试类:
public class Demo {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
}
}
运行结果:
今天晚上真冷啊
案例2
测试类(匿名内部类方式):
public class Demo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("今天真饿啊");
}
}).start();
}
}
运行结果:
今天真饿啊
案例3
测试类(匿名内部类Lambda表达式写法):
public class Demo {
public static void main(String[] args) {
new Thread(()->{
System.out.println("今天要洗澡");
}).start();
}
}
运行结果:
今天要洗澡
Lambda表达式三要素
组成Lambda表达式的三要素:形式参数,箭头,代码块
- () 里面没有内容,可以看成方法形式参数为空
- -> 指向要做的事情
- {} 要执行的代码
格式
格式:(形式参数) -> {代码块}
- 形式参数:如果有多个形式参数,参数之间用逗号隔开;如果没有就空着
使用前提
Lambda表达式的使用前提
- 有一个接口
- 接口中有,且只有一个抽象方法
- 必须有上下文环境,才能推导出Lambda表达式对应的接口
Lambda表达式的省略
- 只有一个形式参数时,参数类型可以省略;()也可以省略
- 参数类型可以省略,但多个参数时,不能只省略某一个
- 如果{}中只有一条不带return的语句时,句末的分号和{}都可以省略
- 如果{}中只有一条带return的语句时,句末的分号和{}都可以省 略,return也可以省略
Lambda表达式和匿名内部类的区别
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且只有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,不能使用Lambda表达式
- 实现原理不同
- 匿名内部类编译之后,产生一个单独的.class字节码文件
- Lambda表达式编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制