优雅的使用Lambda

/ 0评 / 0

这是我之前的一篇笔记,来自: https://www.ibm.com/developerworks/cn/java/j-java8idioms6/index.html

正常写法,一个函数或者方法需要包含4个元素

而Lambda表达式,只有上面四个元素的最后两个

(parameter list) -> body

->,将参数列表与函数主体分离。

函数的主体可能是一个表达式或一条语句

单行Lamdba

(Integer e) -> e * 2

 多行Lambda

(Integer e) -> {
  double sqrt = Math.sqrt(e);
  double log = Math.log(e);
  return sqrt + log;
}

函数组合

函数式编码风格利用了函数组合的表达能力。

命令式风格

int result = 0;
for(int e : values) {
  if(e > 3 && e % 2 == 0) {
    result = e * 2;
    break;
  }
}

函数式风格

int result = values.stream()
  .filter(e -> e > 3)
  .filter(e -> e % 2 == 0)
  .map(e -> e * 2)
  .findFirst()
  .orElse(0);
  1. 给定一些值     [values.stream()]
  2. 仅选择大于3的值        [.filter(e -> e > 3)]
  3. 从这些值中,选择偶数值       [filter(e -> e % 2 == 0)]
  4. 并将它们乘以2        [.map(e -> e * 2)]
  5. 最后挑选第一个结果       [.findFirst()]
  6. 如果没有达到条件的值存在,则返回0       [.orElse(0);]

函数组合的表达能力很大程度上依赖于每个lambda表达式的简洁性,一行即可,多行(两行)都太多!

使用目标

使用Lambda应该尽量做的以下几点,让其保持高度简洁

  1. 通俗易懂
  2. 用途明确
  3. 易测试
  4. 易重用
  5. 专注于某一个目标

具体实践

  1. 尽量避免在lambda表达式中使用括号
  2. 将lambda的表达式,替换为方法引用(封装)

简短的 lambda 表达式能提高代码可读性,这是函数式编程的重要好处之一。包含多行的 lambda 表达式具有相反的效果,会让代码变得杂乱且难以阅读。多行 lambda 表达式还难以测试和重用,这可能导致重复工作和代码质量差。幸运的是,通过将多行 lambda 表达式的主体转移到一个命名函数中,然后从 lambda 表达式内调用该函数,这样很容易避免这些问题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注