“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帝国之泛型》、《Java注解是怎么上位的》)
回到Java 8 的函数式编程,Lambda表达式,这个特性的加入对于日常coding来说似乎不是一个必须品,更重要的是要想写出好的Lambda表达式,思维能力必须得有一定程度的提升和转换才可以。
程序员必须得能意识到Java是一门静态类型的语言,一个变量必须有类型,并且不能改变。 所以Java中的Lambda表达式也必须有个类型(接口)才行。
(参见:《Java 的Lambda表达式有什么用?》)
除此之外,思维也需要从描述“how”变成描述 “what”, 从过程式变成声明式。
这两个障碍在实际编程中表现就是:
Lambda表达式不容易理解,写起来不容易,也不好调试。“还不如用我那简单的for each 循环!” 特别是有些人为了炫技增加了阅读的难度。
我自己在工作学习中偶尔在两个地方使用Lambda表达式, 一个是对集合做遍历的时候,用了一点儿filter和map ; 还有就是用Lambda表达式来替换匿名类,这个用起来比较爽。
《Java 8函数式编程》一书中提到了并行编程,利用stream对象的parallel方法让其拥有并行操作的能力,可以充分利用CPU的多核能力。 还有一节讲的是“使用Lambda表达式实现领域特定语言”。
我不太清楚有多少人在实战中使用类似的功能,在这里做个有奖调查,大家可以通过留言聊一聊你在工作中是怎么使用Java 8的Lambda表达式的, 我会选择三个人,送出三本签名版的《码农翻身》。
码农翻身,用故事讲解技术本质, 更多精彩文章,请移步《码农翻身三年文章精华》