本系列文章译自Venkat Subramaniam的Functional Programming in Java
未完待续,后续文章请继续关注deepinmind。
boolean found = false; for(String city : cities) { if(city.equals("Chicago")) { found = true; break; } } System.out.println("Found chicago?:" + found);这个命令式的版本看起来有点啰嗦而且初级;它分成好几个执行部分。先是初始化一个叫found的布尔标记,然后遍历集合里的每一个元素;如果发现我们要找的城市了,设置下这个标记,然后跳出循环体;最后打印出查找的结果。
System.out.println("Found chicago?:" + cities.contains("Chicago"));这也是一种命令式风格的写法——contains方法直接就帮我们搞定了。
final List假设超过20块的话要打九折,我们先用普通的方式实现一遍。prices = Arrays.asList( new BigDecimal("10"), new BigDecimal("30"), new BigDecimal("17"), new BigDecimal("20"), new BigDecimal("15"), new BigDecimal("18"), new BigDecimal("45"), new BigDecimal("12"));
BigDecimal totalOfDiscountedPrices = BigDecimal.ZERO; for(BigDecimal price : prices) { if(price.compareTo(BigDecimal.valueOf(20)) > 0) totalOfDiscountedPrices = totalOfDiscountedPrices.add(price.multiply(BigDecimal.valueOf(0.9))); } System.out.println("Total of discounted prices: " + totalOfDiscountedPrices);这个代码很熟悉吧;先用一个变量来存储总价;然后遍历所有的价格,找出大于20块的,算出它们的折扣价,并加到总价里面;最后打印出折扣后的总价。下面是程序的输出:
Total of discounted prices: 67.5结果完全正确,不过这样的代码有点乱。这并不是我们的错,我们只能用已有的方式来写。不过这样的代码实在有点初级,它不仅存在基本类型偏执,而且还违反了单一职责原则。如果你是在家工作并且家里还有想当码农的小孩的话,你可得把你的代码藏好了,万一他们看见了会很失望地叹气道,“你是靠这些玩意儿糊口的?”
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
下面我们会说到Java是如何实现这些的。
lambda表达式来拯救世界了
lambda表达式是让我们远离命令式编程烦恼的快捷键。Java提供的这个新特性,改变了我们原有的编程方式,使得我们写出的代码不仅简洁优雅,不易出错,而且效率更高,易于优化改进和并行化。
未完待续,后续文章请继续关注deepinmind。
原创文章转载请注明出处:Java译站
原文:http://blog.csdn.net/spidercoco/article/details/21051389