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

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

时间:2014-09-26 03:26来源:网络整理 作者:网络 点击:
分享到:
这种处理方法有两个问题。首先,它通常导致了重复的工作量并且还增加了维护的成本。第二,很容易忘了业务代码中可能会被抛出来的异常,可能会影响

这种处理方法有两个问题。首先,它通常导致了重复的工作量并且还增加了维护的成本。第二,很容易忘了业务代码中可能会被抛出来的异常,可能会影响到事务的生命周期和修改日志的更新。这里应该使用try, finally块来实现,不过每当有人动了这块代码,我们又得重新确认这个策略没有被破坏。

还有一种方法,我们可以去掉工厂,把这段代码放在它前面。不用再获取事务对象,而是把执行的代码传给一个维护良好的函数,就像这样:

复制代码 代码如下:

runWithinTransaction((Transaction transaction) -> { 
  //... operation to run within the transaction ... 
});  

这是你的一小步,但是省了一大堆事。检查状态同时更新日志的这个策略被抽象出来封装到了runWithinTransaction方法里。我们给这个方法发送一段需要在事务上下文里运行的代码。我们不用再担心谁忘了执行这个步骤或者没有处理好异常。这个实施策略的函数已经把这事搞定了。

我们将会在第五章中介绍如果使用lambda表达式来应用这样的策略。

扩展策略

策略看起来无处不在。除了要应用它们外,企业级应用还需要对它们进行扩展。我们希望能通过一些配置信息来增加或者删除一些操作,换言之,就是能在模块的核心逻辑执行前进行处理。这在Java里很常见,不过需要预先考虑到并设计好。

需要扩展的组件通常有一个或者多个接口。我们需要仔细设计接口以及实现类的分层结构。这样做可能效果很好,但是会留下一大堆需要维护的接口和类。这样的设计很容易变得笨重且难以维护,最终破坏扩展的初衷。

还有一种解决方法——函数式接口,以及lambda表达式,我们可以用它们来设计可扩展的策略。我们不用非得创建新的接口或者都遵循同一个方法名,可以更聚焦要实现的业务逻辑,我们会在73页的使用lambda表达式进行装饰中提到。

轻松实现并发

一个大型应用快到了发布里程碑的时候,突然一个严重的性能问题浮出水面。团队迅速定位出性能瓶颈点是出在一个处理海量数据的庞大的模块里。团队中有人建议说如果能充分发掘多核的优势的话可以提高系统性能。不过如果这个庞大的模块是用老的Java风格写的话,刚才这个建议带来的喜悦很快就破灭了。

团队很快意识到要这把这个庞然大物从串行执行改成并行需要费很大的精力,增加了额外的复杂度,还容易引起多线程相关的BUG。难道没有一种提高性能的更好方式吗?
有没有可能串行和并行的代码都是一样的,不管选择串行还是并行执行,就像按一下开关,表明一下想法就可以了?

听起来好像只有纳尼亚里面能这样,不过如果我们完全用函数式进行开发的话,这一切都将成为现实。内置的迭代器和函数式风格将扫清通往并行化的最后一道障碍。JDK的设计使得串行和并行执行的切换只需要一点不起眼的代码改动就可以实现,我们将会在145页《完成并行化的飞跃》中提到。

讲故事

在业务需求变成代码实现的过程中会丢失大量的东西。丢失的越多,出错的可能性和管理的成本就越高。如果代码看起来就跟描述需求一样,将会很方便阅读,和需求人员讨论也变的更简单,也更容易满足他们的需求。

比如你听到产品经理在说,”拿到所有股票的价格,找出价格大于500块的,计算出能分红的资产总和”。使用Java提供的新设施,可以这么写:

复制代码 代码如下:

tickers.map(StockUtil::getprice).filter(StockUtil::priceIsLessThan500).sum()

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

赞助商链接