第42条 Lambda优先于匿名类
- 匿名类很适合经典的需要函数对象的设计模式,比如策略模式。比如
Comparator
提供了抽象策略,匿名类实现具体策略 - Lambda表达式可以省略参数和返回值的类型,这是因为编译器会通过类型推断(type inference)推导出来。(不能推导出来的时候需要指明)
- 由于lambda是没有名字和文档的,如果一个计算不是自解释的,或是行数较多(对于lambda来说一行最好,三行最多),就不要放在lambda中了
- 通过enum构造传入的参数是在静态环境的,所以从enum构造传入的lambda不能访问枚举的成员变量
- 只能使用匿名类的场景:
- 抽象类或接口有多个需要覆盖的方法
- 需要引用自身(Lambda中的
this
指的还是enclosing instance)
思考
这一条主要讲的还是Lambda的使用。感觉Lambda相比于匿名类,可能仅有的优势就是简洁。所以就像第3点提到的,Lambda表达式里面的内容不宜过长,不然其实不如直接使用匿名类来的清晰,使用匿名类还可以将一个大方法拆分成小方法,可读性更强。
开发中有的时候很容易把Stream
里面的map
写成一个有点长的Lambda表达式,在整个Stream
里面就显得非常另类,一般这种情况我会把这个map
里面的内容单独抽出来一个方法,保证Lambda里面只有一行。
使用Lambda还有一个需要注意的点是对于参数的命名,比如我就很喜欢把map
里面的参数叫做e
,Map
的forEach
写成map.forEach((k, v) -> {})
,这种写起来很简单,但是参数的可读性非常查了,在使用Lambda的时候感觉还是应该把参数命名成实际的意义
网友评论