龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java函数式编程(一):你好,Lambda表达式(2)

时间:2014-09-26 03:26来源:网络整理 作者:网络 点击:
分享到:
这个代码很熟悉吧;先用一个变量来存储总价;然后遍历所有的价格,找出大于20块的,算出它们的折扣价,并加到总价里面;最后打印出折扣后的总价。

这个代码很熟悉吧;先用一个变量来存储总价;然后遍历所有的价格,找出大于20块的,算出它们的折扣价,并加到总价里面;最后打印出折扣后的总价。

下面是程序的输出:

复制代码 代码如下:

Total of discounted prices: 67.5 

结果完全正确,不过这样的代码有点乱。这并不是我们的错,我们只能用已有的方式来写。不过这样的代码实在有点初级,它不仅存在基本类型偏执,而且还违反了单一职责原则。如果你是在家工作并且家里还有想当码农的小孩的话,你可得把你的代码藏好了,万一他们看见了会很失望地叹气道,“你是靠这些玩意儿糊口的?”

还有更好的方式

我们还能做的更好——并且要好很多。我们的代码有点像需求规范。这样能缩小业务需求和实现的代码之间的差距,减少了需求被误读的可能性。

我们不再让Java去创建一个变量然后没完没了的给它赋值了,我们要从一个更高层次的抽象去与它沟通,就像下面的这段代码。

复制代码 代码如下:

final BigDecimal totalOfDiscountedPrices = 
prices.stream() 
.filter(price -> price.compareTo(BigDecimal.valueOf(20)) > 0) 
.map(price -> price.multiply(BigDecimal.valueOf(0.9))) 
.reduce(BigDecimal.ZERO, BigDecimal::add); 
System.out.println("Total of discounted prices: " + totalOfDiscountedPrices); 

大声的读出来吧——过滤出大于20块的价格,把它们转化成折扣价,然后加起来。这段代码和我们描述需求的流程简直一模一样。Java里还可以很方便的把一行长的代码折叠起来,根据方法名前面的点号进行按行对齐,就像上面那样。

代码非常简洁,不过我们用到了Java8里面的很多新东西。首先,我们调用 了价格列表的一个stream方法。这打开了一扇大门,门后边有数不尽的便捷的迭代器,这个我们在后面会继续讨论。

我们用了一些特殊的方法,比如filter和map,而不是直接的遍历整个列表。这些方法不像我们以前用的JDK里面的那些,它们接受一个匿名的函数——lambda表达式——作为参数。(后面我们会深入的展开讨论)。我们调用reduce()方法来计算map()方法返回的价格的总和。

就像contains方法那样,循环体被隐藏起来了。不过map方法(以及filter方法)则更复杂得多 。它对价格列表中的每一个价格,调用了传进来的lambda表达式进行计算,把结果放到一个新的集合里面。最后我们在这个新的集合上调用 reduce方法得出最终的结果。

这是以上代码的输出结果:

复制代码 代码如下:

Total of discounted prices: 67.5 

改进的地方

这和前面的实现相比改进明显:

1.结构良好而不混乱
2.没有低级操作
3.易于增强或者修改逻辑
4.由方法库来进行迭代
5.高效;循环体惰性求值
6.易于并行化

下面我们会说到Java是如何实现这些的。

lambda表达式来拯救世界了

lambda表达式是让我们远离命令式编程烦恼的快捷键。Java提供的这个新特性,改变了我们原有的编程方式,使得我们写出的代码不仅简洁优雅,不易出错,而且效率更高,易于优化改进和并行化。

第二节:函数式编程的最大收获

函数式风格的代码有更高的信噪比;写的代码更少了,但每一行或者每个表达式做的却更多了。比命令式编程相比,函数式编程让我们获益良多:

避免了对变量的显式的修改或赋值,这些通常是BUG的根源,并导致代码很难并行化。在命令行编程中我们在循环体内不停的对totalOfDiscountedPrices变量赋值。在函数式风格里,代码不再出现显式的修改操作。变量修改的越少,代码的BUG就越少。

函数式风格的代码可以轻松的实现并行化。如果计算很费时,我们可以很容易让列表中的元素并发的执行。如果我们想把命令式的代码并行化,我们还得担心并发修改totalOfDiscountedPrices变量带来的问题。在函数式编程中我们只会在完全处理完后才访问这个变量,这样就消除了线程安全的隐患。

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接