Java 函数式编程最佳实践笔记

Joshua Bloch 提出了函数式编程最佳实践的 3 条经验法则,这里总结如下:

1 匿名类与 lambda 表达式,优先选择 lambda

假设需要实现一个根据单词长度排序的功能。

匿名内部类实现方式为:

而 Lambda 表达式的实现方式为:

可以看到, Lambda 表达式摆脱了那些样板代码,给人以简洁 、 直观 、 易懂的印象。


lambda 表达式使用原则:

  • 最理想的是一行代码,最多不超过三行。因为 lambda s 缺少描述说明,无法做到自解释。所以如果 lambda s 过长,会导致难以阅读,需要对其进行简化或重构。
  • 能用匿名类的地方,一般来说,就能改造为 lambda 表达式。但也有一些场景例外。比如在 lambda s 中, this 关键字引用的是外层实例,而匿名类中的 this 关键字引用的匿名类实例。所以如果需要从体内访问函数对象,那就只能使用匿名类。

2 lambda 表达式与方法引用,优先选择方法引用

lambda 表达式与方法引用之间的写法比较:

方法引用 lambdas 函数作用
Integer::parseInt Integer.parseInt(str) 字符串转为整数
Instant.now()::isAfter Instant then = Instant.now();t -> then.isAfter(t) 判定入参是否在当前时间之后
String::toLowerCase str -> str.toLowerCase() 字符串全小写化
TreeMap<Object, Object>::new new TreeMap<Object, Object>() 创建 TreeMap 对象
int[]::new len -> new int[len] 初始化整型数组

相对 lambdas 来说,方法引用更加简洁。


lambda 表达式与方法引用选择策略:

  1. 当方法引用更加简短且清晰时,那就使用方法引用;
  2. 如果方法引用无法满足简短与清晰的条件时,那就使用 lambdas。

3 优先选择标准函数式接口

  1. 如果某个标准的函数式接口可以满足我们要求,那么就应该使用它。
  2. 如果标准函数式接口无法满足,那就自定义一个。自定义接口取个自描述性好的名字,比如 TriFunction 就比 T1Fuction 好。
  3. 某些旧的 、 类似函数式接口的 API ,如果应用广泛并且内部定义了一些有用的方法,建议继续使用。比如 Comparator< T> 比较器,它在结构上等价于 ToIntBiFunction<T , T> 接口,建议继续使用 Comparator< T> 实现比较函数功能。

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/107135510