如何改造老旧代码

重构代码,用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方法对其进行构造。

工厂模式:这个比较复杂,与工厂方法所需参数数量有关系。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章