Java函数式编程
[法] 皮埃尔-伊夫斯·索蒙特(Pierre-Yves Saumont)
译者序
有幸受邀翻译本书。初见书名,心中不免有几分疑虑,难道又是一本教授怎么使用Java 8 lambda来进行函数式编程的书吗?翻了几页,方觉自己大误。本书其实意在如何从零开始,逐步理清函数式编程的思维方式并编写基础类库,不仅授之以鱼,而且授之以渔。只不过由于Java的受众实在太广,所以才使用这门语言罢了。
函数式编程有一个至关重要的前提,那就是函数的输出只能取决于函数的参数(我们会在书中看到生成随机数的例子)。初看上去似乎与Java这门面向对象的语言不搭,但语言只是工具而已,正如你也可以在Haskell中编写命令式风格的代码一样。在一个不太复杂甚至非并发的常规Java系统中,由于程序内部状态的改变,多次调用同一个方法的返回值很可能是不一样的,更不用说所带来的副作用了。在函数式编程中,确定的输入决定了确定的输出,这意味着只要参数对了,结果一定在预期中。也就是说,函数式编程没有无法重现的bug。在这样的前提下,单元测试相对容易实现,而且能极大地增强你的信心。(想想你对目前所在项目的单元测试有多大的信心?)许多个这样的函数复合起来,在不改变信心的同时能够提供更多、更强大的功能,进而带来更大的收益,如无状态的线程安全、必要时才计算的惰性求值、加快多次执行速度的记忆化等。
传统的命令式编程是计算机硬件的抽象,源自图灵机,其实就是外部输入、内部状态、对外部的输出以及对内部状态的改变。函数式编程源自λ演算,即将变量和函数替换为值或表达式并根据运算符进行计算。函数式编程相比命令式编程,代码更简洁、可读性更强,这是因为它的思维方式更倾向于描述什么,而不是怎么做。所以学习过程反而更加自然,并且不需要多么高深的数学基础。可是我们也知道,软件开发没有银弹。新的方法论也会带来新的问题,需要运用新知识来解决。幸运的是,新知识的坑已经有人帮你踩过了,高阶函数、偏应用函数、复合函数、柯里化、闭包………