• 你在使用Lambda表达式吗?
  • 发布于 1周前
  • 20 热度
    0 评论
“Java 8 的函数式编程都在哪儿用啊?”
前几天,当有人向我提出这个问题的时候,我还真是愣了一下,是啊,2014年 Java8 已经发布了,函数式编程的特性是一个重头戏,有一段时间挺火热的,网上的文章也铺天盖地,可是我在工作和学习中用得并不多啊。

Java 的每一个版本都会引入不少新特性,同时尽可能地向后兼容,这一点确实挺棒的。

比如JDK 1.1 中引入了JDBC, Java Bean 。

JDK1.2(J2SE 1.2 )中的JIT Complier 。

JDK1.4  (J2SE 1.4) 中的 非阻塞IO。

JDK 5 (宣传需要,命名改变,从1.4 直接变为5) 中的泛型和注解,强化的for each循环。

JDK 8 增加了函数式编程。

JDK 9 增加了模块化支持。

......

这些版本中我觉得对程序员日常coding 影响最大的可能就是 JDK 5。

泛型增强了类型安全,每次创建一个集合变量时,如果不声明类型简直就觉得难受。
List<Employee> list = new ArrayList<Employee>();
自定义注解则可以给类、方法、字段添加了元数据,这一点点的元数据就让Spring之类的框架大显身手。

@Controller , @Autowired, @RequestMapping ......极大地简化了程序的配置,让程序容易编写,容易阅读,解放了生产力。

增强的for each 让人用起来也非常舒服:
List<Employee> list= ......
for(Employee e: list){
    //do something.
}

这些JDK的特性改变了编程的习惯,提升了程序员的生产力,是程序员的福音,所以大家都喜欢使用。

回到Java 8 的函数式编程,Lambda表达式,这个特性的加入对于日常coding来说似乎不是一个必须品,更重要的是要想写出好的Lambda表达式,思维能力必须得有一定程度的提升和转换才可以。

程序员必须得能意识到Java是一门静态类型的语言,一个变量必须有类型,并且不能改变。 所以Java中的Lambda表达式也必须有个类型(接口)才行。

除此之外,思维也需要从描述“how”变成描述 “what”, 从过程式变成声明式。

这两个障碍在实际编程中表现就是: 

Lambda表达式不容易理解,写起来不容易,也不好调试。“还不如用我那简单的for each 循环!”  特别是有些人为了炫技增加了阅读的难度。

我自己在工作学习中偶尔在两个地方使用Lambda表达式, 一个是对集合做遍历的时候,用了一点儿filter和map ; 还有就是用Lambda表达式来替换匿名类,这个用起来比较爽。

《Java 8函数式编程》一书中提到了并行编程,利用stream对象的parallel方法让其拥有并行操作的能力,可以充分利用CPU的多核能力。 还有一节讲的是“使用Lambda表达式实现领域特定语言”。
用户评论