重构代码,用Lambda表达式取代匿名类
由于Lambda可以看做是函数式接口的实例,因此,只能将实现了单一抽象方法的匿名类转换为Lambda表达式。
注意事项:
①匿名类和Lambda表达式中的this和super的含义是不同的。在匿名类中,this代表的是类自身,但是在Lambda中,它代表的是包含类。
②匿名类可以屏蔽包含类的变量,而Lambda表达式不能屏蔽,通俗来讲就是匿名类可以覆盖包含类同名、同类型变量,而Lambda表达式则不能覆盖。
③在涉及重载的上下文里,将匿名类转换为Lambda表达式可能导致最终的代码更加晦涩。因为Lambda只要让其方法签名与接口方法保持一致即可,这就导致了同一个Lambda可以适用于好几个接口,而匿名类则不会出现这种情况,因为匿名类的类型是在初始化时确定的,而Lambda的类型取决于它的上下文。
用方法引用重构Lambda表达式
使用JAVA8 API提供的辅助类,然后再借用方法名,这种组合往往能更直观地表达代码的意图。
用Stream API重构命令式的数据处理
建议将所有使用迭代器处理模式处理集合的代码都转换成Stream API的方式。
Stream API能更清晰地表达数据处理管道的意图,同时通过短路和延迟载入、计算机的多核架构可以进行优化。
常用的方式有2种:有条件的延迟执行和环绕执行。
Lambda表达式对设计模式的影响
策略模式:无需声明新的类来实现不同的策略,可以直接通过传递Lambda表达式就能达到同样的目的。
模板方法:想要插入的不同算法组件可以通过Lambda表达式或者方法引用的方式实现。
观察者模式:如果观察者逻辑比较复杂,则建议继续使用类形式,而不是Lambda表达式。
责任链模式:使用andThen方法对其进行构造。
工厂模式:这个比较复杂,与工厂方法所需参数数量有关系。