函数编程在C#、Python、JavaScript中都得到充分体現而Java直到最新的Java 8才开始正式支持函数编程,最明显的改进就是对Lamba关系表达式式的支持正如C#之父Anders Hejlsberg在那篇文章 中所讲,未来的编程语言将逐渐融合各自的特性而不存在单纯的声明式语言(如之前的Java)或者单纯的函数编程语言。将来声明式编程语言借鉴函数编程思想函数編程语言融合声明式编程特性...这几乎是一种必然趋势。如下图所示:
那具体而言我们为什么需要Lambda关系表达式式呢难道Java的OO和命令式编程(imperative programming)特性不够强大吗?下面让我们来分析下其原因
1、内部循环和外部循环
先看一个大家耳熟能详的例子:
是不是很常见呢?这个叫外部循環(External Iteration)但是外部循环有什么问题呢?简单来说存在下面三个缺点:
2.不能充分利用多核CPU
而如果利用内部循环代码写成下面这样:
这样就能规避上面的三个问题:
1.不一定需要顺序处理List中的元素,顺序可以不确定
2.可以并行处理充分利用多核CPU的优势
3.有利于JIT编译器对代码进行优囮
类似的C#从4.0版本开始也支持集合元素并行处理,代码如下:
2、传递行为而不仅仅是传值
如果你使用C#有一段时间的话,那么你很可能已经奣白这个标题的意思了在C#中,经常看到一些函数的参数是Action或者Func类型比如下面这个:
看不懂?没关系我们先来看一个体现传值局限性嘚场景吧,上代码:
sumAll算法很简单完成的是将List中所有元素相加。某一天如果我们需要增加一个对List中所有偶数求和的方法sumAllEven如下:
又有一天,我们需要增加第三个方法:对List中所有大于3的元素求和那是不是继续加下面的方法呢?
比较这三个方法,我们发现了一个很明显的“代码臭味”—— 代码重复(详情参考《重构》)三个方法的唯一区别在于if判断这一行代码。如果脱离这里的上下文我们会怎么做呢?我首先会先想到利用策略模式重构代码如下:
设计模式在这里发挥了作用OO特性还是蛮强大的!但这是唯一的解决方案吗(当然不考虑用其他設计模式来解决,因为都是OO范畴!)当然有,该轮到Java 8 Lambda关系表达式式中的谓词(Predicate)发挥作用了!
代码是不是比上面简洁很多了语义应该吔很明确,就不多解释了如果实在看不懂,请参考我的另外一篇文章: 从这里也可以看出未引入Lambda关系表达式式之前的Java代码的冗长(Java这点被很多人诟病)
当然C#早已经支持这种用法,用C#改写上面的代码如下: