接上篇:
七、 Lambda表达式实践
上面介绍了这么多知识,这章将详细介绍Lambda表达式的实践。这里,将以ODPS查询封装为例子,详细地介绍如何使用和优化Lambda表达式。
1. 查询ODPS数据代码
这里,有一段查询公司雇员的方法:
类似地,还有几段从ODPS查询数据的代码。
2. 利用内部类进行优化
因为上面代码的重复性,我们可以采用设计模式——模板方法模式(Template Method Pattern),把相同的部分固化下来,并把不同的部分抽象出接口。那么,我们就抽象出一个接口DataParser(数据解析器),并把ODPS数据查询固化到OdpsService的executeQuery方法中。
那么,采用匿名内部类的编写方法,可以把queryEmployee改为:
3. 利用Lambda表达式优化
从上面例子可以看出,利用内部类实现queryEmployee方法,由于模式代码比较多,显得代码比较啰嗦。这里,利用Lambda表达式进行优化。
可以看出,代码量大大地减少了。
4. 去掉自定义的函数式接口
为了减少代码中自定义函数式接口,可以利用Java提供的4个基本函数式接口。这里,我们采用函数接口“Function,T>”替换掉“DataParser”。
5. 利用提取方法优化Lambda表达式
上面的例子中,最大的问题就是——Lambda表达式理解困难,没有一个名称或注释,需要看完Lambda表达式后才能理解。通过第6章的方法,可以把Lambda表达式抽象成一个方法,从而达到优化Lambda表达式的目的。
6. 利用方法引用优化Lambda表达式
我们使用Lambda表达式,就是希望代码更精简。上面例子中,Lambda表达式还可以采用方法引用的方式进行精简,从而最终达到“完美的Lambda表达式只有一行”的目标。
7. 变化1:需要传递参数或变量
如果需要把方法参数companyId传给每一个EmployeeDO对象,最终的代码如下:
8. 变化2:需要抽象出多个方法
如果需要抽象出多个方法,还想使用函数式编程,就需要声明多个函数式接口参数。比如:分批查询并保存数据。
注意:
“parseEmployee”被定义为static方法,方法引用为“EmployeeService::parseEmployee”;而“storageEmployee”被定义为private方法,方法引用为“this::storageEmployee”。具体原因,请参考第3章。
9. 总结:由繁至简,由简至明
通过这个过程,可以总结出一个使用Lambda表达式的历程——“由繁至简,由简至明”:
1) 由繁至简
通过Lambda表达式,消除了很多模式代码,把复杂的代码进行简化;但是,也正由于代码过于简略,失去了代码可读性和可维护行。
2) 由简至明
为了提高代码的可读性和可维护行,又不得不损失一些简化,利用提取方法等机制,让Lambda表达式变得更明确。
接下篇:https://developer.aliyun.com/article/1226748?groupCode=java