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

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

时间:2014-09-26 03:26来源:网络整理 作者:网络 点击:
分享到:
这个转化过程几乎是无损的,因为基本上也没什么要转化的。这是函数式在发挥作用,在本书中还会看到更多这样的例子,尤其是第8章,使用lambda表达式

这个转化过程几乎是无损的,因为基本上也没什么要转化的。这是函数式在发挥作用,在本书中还会看到更多这样的例子,尤其是第8章,使用lambda表达式来构建程序,137页。

关注隔离

在系统开发中,核心业务和它所需要的细粒度逻辑通常需要进行隔离。比如说,一个订单处理系统想要对不同的交易来源使用不同的计税策略。把计税和其余的处理逻辑进行隔离会使得代码重用性和扩展性更高。

在面向对象编程中我们把这个称之为关注隔离,通常用策略模式来解决这个问题。解决方法一般就是创建一些接口和实现类。

我们可以用更少的代码来完成同样的效果。我们还可以快速尝试自己的产品思路,而不用上来就得搞出一堆代码,停滞不前。我们将在63页的,使用lambda表达式进行关注隔离中进一步探讨如果通过轻量级函数来创建这种模式以及进行关注隔离。

惰性求值

开发企业级应用时,我们可能会与WEB服务进行交互,调用数据库,处理XML等等。我们要执行的操作有很多,不过并不是所有时候都全部需要。避免某些操作或者至少延迟一些暂时不需要的操作是提高性能或者减少程序启动,响应时间的一个最简单的方式。

这只是个小事,但用纯OOP的方式来实现还需要费一番工夫。为了延迟一些重量级对象的初始化,我们要处理各种对象引用 ,检查空指针等等。

不过,如果使用了新的Optinal类和它提供的一些函数式风格的API,这个过程将变得很简单,代码也更清晰明了,我们会在105页的延迟初始化中讨论这个。

提高可测性

代码的处理逻辑越少,容易被改错的地方当然也越少。一般来说函数式的代码比较容易修改,测试起来也较简单。

另外,就像第4章,使用lambda表达式进行设计和第5章资源的使用中那样,lambda表达式可以作为一种轻量级的mock对象,让异常测试变得更清晰易懂。lambda表达式还可以作为一个很好的测试辅助工具。很多常见的测试用例都可以接受并处理lambda表达式。这样写的测试用例能够抓住需要回归测试的功能的本质。同时,需要测试的各种实现都可以通过传入不同的lambda表达式来完成。
JDK自己的自动化测试用例也是lambda表达式的一个很好的应用范例——想了解更多的话可以看下OpenJDK仓库里的源代码。通过这些测试程序可以看到lambda表达式是如何将测试用例的关键行为进行参数化;比如,它们是这样构建测试程序的,“新建一个结果的容器”,然后“对一些参数化的后置条件进行检查”。

我们已经看到,函数式编程不仅能让我们写出高质量的代码,还能优雅的解决开发过程中的各种难题。这就是说,开发程序将变得更快更简单,出错也更少——只要你能遵守我们后面将要介绍到的几条准则。

第四节:进化而非革命

我们用不着转向别的语言,就能享受函数式编程带来的好处;需要改变的只是使用Java的一些方式。C++,Java,C#这些语言都支持命令式和面向对象的编程。不过现在它们都开始投入函数式编程的怀抱里了。我们刚才已经看到了这两种风格的代码,并讨论了函数式编程能带来的好处。现在我们来看下它的一些关键概念和例子来帮助我们学习这种新的风格。

Java语言的开发团队花费了大量的时间和精力把函数式编程的能力添加到了Java语言和JDK里。要享受它带来的好处,我们得先介绍几个新的概念。我们只要遵循下面几条规则就能提升我们的代码质量:

1.声明式
2.提倡不可变性
3.避免副作用
4.优先使用表达式而不是语句
5.使用高阶函数进行设计

我们来看下这几条实践准则。

声明式

我们所熟悉的命令式编程的核心就是可变性和命令驱动的编程。我们创建变量,然后不断修改它们的值。我们还提供了要执行的详细的指令,比如生成迭代的索引标志,增加它的值,检查循环是否结束,更新数组的第N个元素等。在过去由于工具的特性和硬件的限制,我们只能这么写代码。 我们也看到了,在一个不可变集合上,声明式的contains方法比命令式的更容易使用。所有的难题和低级的操作都在库函数里来实现了,我们不用再关心这些细节。就冲着简单这点,我们也应该使用声明式编程。不可变性和声明式编程是函数式编程的精髓,现在Java终于把它变成了现实。

提倡不可变性

精彩图集

赞助商链接