携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
一个 Lambda 表达式,也总结了蛮多次,感觉也差不多了,今天做个结尾,把最后的一点关于 Lambda 表达式的点做个整理收尾......不多哔哔,淦!
Lambda 表达式的优点与缺点
使用 Lambda 表达式的优点
- 让代码更简洁、更紧凑;
- 能够使用并行流来并行处理,充分利用多核 CPU 的优势,有利于 JIT 编译器对代码进行优化;
使用 Lambda 表达式的缺点
- 非并行计算的情况下,其计算速度比传统的 for 循环还慢;
- 不容易调试;
- 还是那句话,由于使用 Lambda 表达式简化了代码的书写,就使那些不懂 Lambda 表达式的人开代码时不容易看懂(如本人);
Lambda 表达式访问局部变量受限的原因
在整理上一篇关于 Lambda 表达式的知识时,就通过代码举例的形式证明过:Lambda 表达式 不能 访问 非 final 修饰的局部变量。原因是什么呢?
局部变量是保存在栈帧中的,在 Java 的线程模型中,栈帧中的局部变量是线程私有的,如果允许 Lambda 表达式访问到栈帧中的变量地址并进行局部变量的修改,可能导致线程私有的数据被并发访问,从而造成线程不安全问题。
对于引用类型的变量,由于 Java 是值传递,又因为引用类型的指向内容是保存在堆中,是线程共享的,所以 Lambda 表达式中 可以修改 引用类型的局部变量的 内容,但 不能修改 该变量的 引用。
而对于基本数据类型的变量,在 Lambda 表达式中只是获取到该变量的副本,而且局部变量是线程私有的,因此无法感知其他线程对该变量的修改,如果该变量 不用 final 修饰,会产生 数据不同步 的问题。
Lambda 表达式对 实例变量、静态变量 不受限制,因为实例变量、静态变量是保存在堆中(Java8之后),而堆是线程共享的。所以在 Lambda 表达式内部是可以知晓实例变量、静态变量的变化的,不会产生数据不同步等问题。
收尾工作,简单整理了一下......主要是介绍了一下使用 Lambda 表达式的优缺点,两外想着重强调一下 Lambda 表达式访问局部变量受限制的原因,因为昨天只是证明了一下会对哪些局部变量做限制,并未提及原由,需要注意......
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!