Java 8函数式编程
上QQ阅读APP看书,第一时间看更新

前言

多年以来,函数式编程被认为是少数人的游戏,这些人总是强调自己在智力上的优越性,认为函数式编程的智慧不适合推广给普罗大众。写作此书的目的就是为了挑战这种思想,函数式编程并没有多么了不起,也绝不是少数人的游戏。

在过去的两年中,我请伦敦Java社区的开发人员以各种方式测试Java 8的新特性。我发现很多人都喜欢Java 8的新用法和类库。他们有可能被一些术语和高大上的概念吓到,但是稍稍一丁点儿函数式编程技巧都能给编程带来便利,他们对此喜不自胜。人们津津乐道的话题之一是使用新的Stream API操作对象和集合类时(比如从所有的唱片列表中过滤出在英国本地出品的唱片时),代码是多么易读。

组织这些Java社区活动,让我认识到了示例代码的重要性。人们通过不断地阅读和消化这些简单的示例,最终归纳出某种模式。我还意识到术语是多么令人讨厌,因此,在介绍一个晦涩的概念时,我都会给出通俗易懂的解释。

对很多人来说,Java 8提供的函数式编程元素有限:没有单子别担心,这是本书唯一提及单子的地方。,没有语言层面的惰性求值,也没有为不可变性提供额外支持。对实用至上的程序员来说,这没什么大不了的,我们只想在类库级别抽象,写出简单干净的代码来解决业务问题。如果有人为我们写出这样的类库,那再好不过了,这样我们就可以把主要精力放在日常工作上了。

为什么要阅读本书

本书将探讨如下主题。

• 如何编写出简单、干净、易读的代码——尤其是对于集合的操作?

• 如何简单地使用并行计算提高性能?

• 如何准确地为问题建模,并且开发出更好的领域特定语言?

• 如何写出不易出错,并且更简单的并发代码?

• 如何测试和调试Lambda表达式?

将Lambda表达式加入Java,并不只是为了提高开发人员的生产效率,业界也对这一特性有根本性的需求。

本书读者对象

本书面向那些已经掌握Java SE,并且想尽快了解Java 8新特性的开发人员。

如果你对Lambda表达式感兴趣,想知道它怎么帮助你提升专业技能,那么这本书就是为你而写的。我假设读者还不知道Lambda表达式,以及Java 8中核心类库的变化,我将从零开始介绍这些概念、类库和技术。

虽然我想让所有开发人员都来买这本书,但这不现实,这不是一本适合所有人的书。如果你一点儿也不懂Java,那么这本书就不适合你。同时,尽管本书会详细讲解Java中的Lambda表达式,但是我不会解释怎样在其他语言中使用Lambda表达式。

我也不会讲解Java SE中一些基本的概念,比如集合类、匿名内部类或者Swing中的事件处理机制。我假设读者已经掌握了这些知识。

怎样阅读本书

本书采用了示例驱动的写作风格:介绍完一个概念之后,就会紧跟一段代码。代码中的一些片段,有时你可能无法全部看懂。没关系,通常在代码后面会紧跟一段文字,讲解代码的细节。

这种方式能让你边学边练,多数章节还在最后提供了练习题,供读者自行练习。我强烈建议读者读完一章后完成这些练习,熟能生巧。每个务实的程序员都知道,自欺欺人很容易,你觉得读懂一段代码了,其实还是遗漏了一些细节。

使用Lambda表达式,就是将复杂性抽象到类库的过程。在本书中,我会引入很多常用类库的细节。第2章至第6章介绍了JDK 8中核心语言的变化以及升级后的类库。

最后三章介绍了如何在真实环境下使用函数式编程。第7章介绍一些让测试和调试Lambda表达式变得容易的技巧;第8章解释现有的那些良好的软件设计原则如何应用到Lambda表达式上;第9章讨论并发,怎样使用Lambda表达式写出易读且易于维护的并发代码。涉及第三方类库时,这些章节也会加以介绍。

读者可以将前四章当作Java 8的入门指南——要用好Java 8,每个人都必须学会这些知识。后面的几章难度略高,但掌握了这几章的内容,你就可以成为知识更加全面的程序员,在自己的设计中得心应手地使用Lambda表达式。你在不断学习的过程中,也会接触大量的练习,答案可以在GitHub(https://github.com/RichardWarburton/java-8-Lambdas-exercises)上找到。如果你能边学边练,就能迅速掌握Lambda表达式。

本书排版规范

本书使用以下排版规范。

• 楷体

表示新术语。

• 等宽字体

表示程序片段,也用于在正文中表示程序中使用的变量、函数名、数据库、数据类型、环境变量、语句和关键字等元素。

• 等宽粗体

表示应该由用户逐字输入的命令或者其他文本。

• 等宽斜体

表示将由用户提供的值(或由上下文确定的值)替换的文本。

这个图标表示提示或建议。

这个图标表示重要说明。

这个图标表示警告或提醒。

使用代码示例

可以在这里下载本书随附的资料(代码示例、练习题等):https://github.com/RichardWarburton/java-8-lambdas-exercises

让本书助你一臂之力。也许你需要在自己的程序或文档中用到本书中的代码。除非大段大段地使用,否则不必与我们联系取得授权。例如,无需请求许可,就可以用本书中的几段代码写成一个程序。但是销售或者发布O'Reilly图书中代码的光盘则必须事先获得授权。引用书中的代码来回答问题也无需授权。将大段的示例代码整合到你自己的产品文档中则必须经过许可。

使用我们的代码时,希望你能标明它的出处,但不强求。出处信息一般包括书名、作者、出版商和书号,例如:Java 8 Lambdas, Richard Warburton著(O'Reilly,2014)。版权所有,978-1-449-37077-0。

如果还有关于使用代码的未尽事宜,可以随时与我们联系:permissions@oreilly.com

Safari®Books Online

Safari Books Online(http://www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。

Safari Books Online是技术专家、软件开发人员、Web设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。

对于组织团体、政府机构和个人,Safari Books Online提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online的更多信息,我们网上见。

联系我们

请把对本书的评价和问题发给出版社。

美国:

O'Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

O'Reilly的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:

http://oreil.ly/java_8_lambdas

对于本书的评论和技术性问题,请发送电子邮件到:

bookquestions@oreilly.com

要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:

http://www.oreilly.com

我们在Facebook的地址如下:http://facebook.com/oreilly

请关注我们的Twitter动态:http://twitter.com/oreillymedia

我们的YouTube视频地址如下:http://www.youtube.com/oreillymedia

致谢

虽然本书的封面上署的是我的名字,但本书得以出版要归功于很多人。

首先要感谢我的编辑Meghan和O'Reilly的出版团队,他们让整个出版过程变得很愉快,而且他们还适当加快了本书的出版进度。还要感谢Martijn和Ben将我引荐给Meghan,没有这次会面就不会有这本书。

审阅过程极大地提升了本书的质量,衷心感谢那些正式或非正式参与审阅的朋友,他们是: Martijn Verburg、Jim Gough、John Oliver、Edward Wong、Brian Goetz、Daniel Bryant、Fred Rosenberger、Jaikiran Pai和Mani Sarkar。尤其要感谢Martijn,他给了我如何写一本技术书的实战指导。

如果忘记感谢Oracle公司的Project Lambda项目组,我不会原谅自己。更新一个成熟的语言是一项巨大的挑战,他们不辱使命,我也因此有了得以编写本书的素材。在Java 8发布早期版本时,伦敦的Java社区积极参与测试,通过这些测试,很容易就发现了开发人员犯了哪类错误,哪些地方可以修复,感谢他们!

在写作本书的过程中,我得到了很多人的支持和帮助,特别是我的父母。在我需要的时候,他们总是陪伴在身边。我的朋友们也总是给我积极的评价和鼓励,包括Compsoc里的那些老伙计们,特别是Sadiq Jaffer和基督少年军,感谢你们!