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

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

时间:2014-09-26 03:26来源:网络整理 作者:网络 点击:
分享到:
代码的表达性更强。命令式编程要分成好几个步骤要说明要做什么——创建一个初始化的值,遍历价格,把折扣价加到变量上等等——而函数式的话只需要

代码的表达性更强。命令式编程要分成好几个步骤要说明要做什么——创建一个初始化的值,遍历价格,把折扣价加到变量上等等——而函数式的话只需要让列表的map方法返回一个包括折扣价的新的列表然后进行累加就可以了。
函数式编程更简洁;和命令式相比同样的结果只需要更少的代码就能完成。代码更简洁意味着写的代码少了,读的也少了,维护的也少了——看下第7页的"简洁少就是简洁了吗"。

函数式的代码更直观——读代码就像描述问题一样——一旦我们熟悉语法后就很容易能看懂。map方法对集合的每个元素都执行了一遍给定的函数(计算折扣价),然后返回结果集,就像下图演示的这样。


图1——map对集合中的每个元素执行给定的函数

有了lambda表达式之后,我们可以在Java里充分发挥函数式编程的威力。使用函数式风格,就能写出表达性更佳,更简洁,赋值操作更少,错误更少的代码了。
支持面向对象编程是Java一个主要的优点。函数式编程和面向对象编程并不排斥。真正的风格变化是从命令行编程转到声明式编程。在Java 8里,函数式和面向对象可以有效的融合到一起。我们可以继续用OOP的风格来对领域实体以及它们的状态,关系进行建模。除此之外,我们还可以对行为或者状态的转变,工作流和数据处理用函数来进行建模,建立复合函数。

第三节:为什么要用函数式风格?

我们看到了函数式编程的各项优点,不过使用这种新的风格划得来吗?这只是个小改进还是说换头换面?在真正在这上面花费工夫前,还有很多现实的问题需要解答。

复制代码 代码如下:

小明问到:
代码少就是简洁了吗?

简洁是少而不乱,归根结底是说要能有效的表达意图。它带来的好处意义深远。
写代码就好像把配料堆到一起,简洁就是说能把配料调成调料。要写出简洁的代码可得下得狠工夫。读的代码是少了,真正有用的代码对你是透明的。一段很难理解或者隐藏细节的短代码只能说是简短而不是简洁。

简洁的代码竟味着敏捷的设计。简洁的代码少了那些繁文缛节。这是说我们可以对想法进行快速尝试,如果不错就继续,如果效果不佳就迅速跳过。

用Java写代码并不难,语法简单。而且我们也已经对现有的库和API很了如指掌了。真正难的是要拿它来开发和维护企业级的应用。

我们要确保同事在正确的时间关闭了数据库连接,还有他们不会不停的占有事务,能在合适的分层上正确的处理好异常,能正确的获得和释放锁,等等。

这些问题任何一个单独来看都不是什么大事。不过如果和领域内的复杂性一结合的话,问题就变得很棘手了,开发资源紧张,难以维护。

如果把这些策略封装成许多小块的代码,让它们各自进行约束管理的话,会怎么样呢?那我们就不用再不停的花费精力去实施策略了。这是个巨大的改进, 我们来看下函数式编程是如何做到的。

疯狂的迭代

我们一直都在写各种迭代来处理列表,集合,还有map。在Java里使用迭代器再常见不过了,不过这太复杂了。它们不仅占用了好几行代码,还很难进行封装。

我们是如何遍历集合并打印它们的?可以使用一个for循环。我们怎么从集合里过滤出一些元素?还是用for循环,不过还需要额外增加一些可修改的变量。选出了这些值后,怎么用它们求出最终值,比如最小值,最大值,平均值之类的?那还得再循环,再修改变量。

这样的迭代就是个万金油,啥都会点,但样样稀松。现在Java为许多操作都专门提供了内建的迭代器:比如只做循环的,还有做map操作的,过滤值的,做reduce操作的,还有许多方便的函数比如 最大最小值,平均值等等。除此之外,这些操作还可以很好的组合起来,因此我们可以将它们拼装到一起来实现业务逻辑,这样做既简单代码量也少。而且写出来的代码可读性强,因为它从逻辑上和描述问题的顺序是一致的。我们在第二章,集合的使用,第19页会看到几个这样的例子,这本书里这样的例子也比比皆是。

应用策略

策略贯穿于整个企业级应用中。比如,我们需要确认某个操作已经正确的进行了安全认证,我们要保证事务能够快速执行,并且正确的更新修改日志。这些任务通常最后就变成服务端的一段普通的代码,就跟下面这个伪代码差不多:

复制代码 代码如下:

Transaction transaction = getFromTransactionFactory(); 
//... operation to run within the transaction ... 
checkProgressAndCommitOrRollbackTransaction(); 
UpdateAuditTrail(); 

精彩图集

赞助商链接