一、变量捕获
Lambda 表达式中存在变量捕获 ,了解了变量捕获之后,我们才能更好的理解Lambda 表达式的作用域 。Java当中的匿名类中,会存在变量捕获。
1.匿名内部类
我们在前面的博客——> 中提到了匿名内部类中变量的捕获。
匿名内部类中:一定是程序在运行的过程当中没有发生改变的量
如果把捕获的变量 a在匿名内部类中修改,就会报错。
2.Lambda的变量捕获
Lambda的变量捕获,同样也是不能捕获放生改变的,如果发生改变就会报错。
二、Lambda在集合当中的使用
为了能够让Lambda和Java的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与Lambda表达式对接。要用Lambda遍历集合就一定要看懂源码。
1.List和forEach、sort
forEach()方法遍历集合,先得看一下源码。如果要打印元素,它需要的实现 Consumer接口,同时要实现重写accept()方法,它会把数组里的每一个元素都交给,accept()方法。
代码示例:
运行结果:
再来看一下 sort 方法
运行结果:
2.HashMap和forEach
HashMap的forEach源码需要的是两个参数。
运行结果
改为Lambda后
运行结果
总结
Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读
优点:
- 代码简洁,开发迅速
- 方便函数式编程
- 非常容易进行并行计算
- Java 引入 Lambda,改善了集合操作
缺点:
- 代码可读性变差
- 在非并行计算中,很多计算未必有传统的 for 性能要高
- 不容易进行调试
Lambda表达式有什么使用前提: 必须是接口的匿名内部类,接口中只能有一个抽象方法