六、 完美的Lambda表达式
简短的Lambda表达式是提高代码可读性,这是函数式编程的重要好处之一。但是,复杂的Lambda表达式具有相反的效果,会让代码变得更加杂乱且难以阅读。如果将复杂的Lambda表达式变成一行,这样就很容易避免这些问题。这里,作者提倡一个理念——“最完美的Lambda表达式只有一行”。
如何把Lambda表达式简化为一行,作者总结了以下方法供大家参考。
1. 利用省略语法来简化Lambda表达式
利用Lambda省略语法,尽量把Lambda表达式精简为单语句的表达式,使其成为只有一行的最完美的Lambda表达式。常见的精简Lambda表达式的省略语法有:
• 去掉参数类型:Lambda表达式不需要声明参数类型,编译器可以自动识别参数类型;
• 去掉参数圆括号:Lambda表达式只有一个参数无需定义圆括号,但多个参数需要定义圆括号;
• 去掉主体大括号:如果Lambda表达式主体只有一条语句,就不需要定义主体的大括号;
• 去掉返回关键字:如果Lambda表达式主体只有一条返回语句,就不需要定义返回关键字。
下面,将以“求1到100的偶数和”为例说明如何“精简为单语句表达式”。
• 原始代码
• 优化代码
2. 利用方法引用来简化Lambda表达式
通过上一章方法优化的单语句Lambda表达式,还有可能存在继续优化的空间。比如,可以替换为方法引用Lambda表达式(包括构造方法引用、静态方法引用、实例方法引用和参数类方法引用),会让Lambda表达式显得更精简。
• 原始代码
• 优化代码
在上面优化代码中,同时采用了三种方法引用语法:
• Objects::nonNull采用了静态方法引用语法;
• Student::getId采用了参数类方法引用语法;
• TreeSet::new采用了构造方法引用语法。
3. 利用提取方法来简化Lambda表达式
对于无法简化为单语句或方法引用的多语句Lambda表达式,可以先提取Lambda表达式为一个方法,然后采用静态方法引用语法或实例方法引语法用来简化Lambda表达式。
• 原始代码
• 优化代码
在上面例子中,提取Lambda表达式为一个私有静态方法,然后采用静态方法引用简化Lambda表达式。为什么不提取Lambda表达式为一个私有普通方法呢?因为提取的buildEmployee方法非常独立,不依赖与EmployeeService类中的任何属性字段,一般建议定义为私有静态方法。
接下篇: