简单地说,Java 8中的新增功能是自Java 1.0发布18年以来,Java发生的最大变化。没有去掉任何东西,因此你现有的Java代码都能工作,但新功能提供了强大的新语汇和新设计模式,能帮助你编写更清楚、更简洁的代码。就像遇到所有新功能时那样,你一开始可能会想:“为什么又要去改我的语言呢?”但稍加练习之后,你就会发觉自己只用预期的一半时间,就用新功能写出了更短、更清晰的代码,这时你会意识到自己永远无法返回到“旧Java”了。
本书会帮助你跨过“原理听起来不错,但还是有点儿新,不太适应”的门槛,从而熟练地进行编程。
“也许吧,”你可能会想,“可是Lambda、函数式编程,这些不是那些留着胡子、穿着凉鞋的学究们在象牙塔里面琢磨的东西吗?”或许是的,但Java 8中加入的新想法的分量刚刚好,它们带来的好处也可以被普通的Java程序员所理解。本书会从普通程序员的角度来叙述,偶尔谈谈“这是怎么来的”。
“Lambda,听起来跟天书一样!”是的,也许是这样,但它是一个很好的想法,让你可以编写简明的Java程序。许多人都熟悉事件处理器和回调函数,即注册一个对象,它包含会在事件发生时使用的一个方法。Lambda使人更容易在Java中广泛应用这种思想。简单来说,Lambda和它的朋友“方法引用”让你在做其他事情的过程中,可以简明地将代码或方法作为参数传递进去执行。在本书中,你会看到这种思想出现得比预想的还要频繁:从加入作比较的代码来简单地参数化一个排序方法,到利用新的Stream API在一组数据上表达复杂的查询指令。
“流(stream)是什么?”这是Java 8的一个新功能。它们的特点和集合(collection)差不多,但有几个明显的优点,让我们可以使用新的编程风格。首先,如果你使用过SQL等数据库查询语言,就会发现用几行代码写出的查询语句要是换成Java要写好长。Java 8的流支持这种简明的数据库查询式编程——但用的是Java语法,而无需了解数据库!其次,流被设计成无需同时将所有的数据调入内存(甚至根本无需计算),这样就可以处理无法装入计算机内存的流数据了。但Java 8可以对流做一些集合所不能的优化操作,例如,它可以将对同一个流的若干操作组合起来,从而只遍历一次数据,而不是花很大代价去多次遍历它。更妙的是,Java可以自动将流操作并行化(集合可不行)。
“还有函数式编程,这又是什么?”就像面向对象编程一样,它是另一种编程风格,其核心是把函数作为值,前面在讨论Lambda的时候提到过。
Java 8的好处在于,它把函数式编程中一些最好的想法融入到了大家熟悉的Java语法中。有了这个优秀的设计选择,你可以把函数式编程看作Java 8中一个额外的设计模式和语汇,让你可以用更少的时间,编写更清楚、更简洁的代码。想想你的编程兵器库中的利器又多了一样。
当然,除了这些在概念上对Java有很大扩充的功能,我们也会解释很多其他有用的Java 8功能和更新,如默认方法、新的Optional
类、CompletableFuture
,以及新的日期和时间API。
别急,这只是一个概览,现在该让你自己去看看本书了。
本书结构
本书分为四个部分:“基础知识”“函数式数据处理”“高效Java 8编程”和“超越Java 8”。我们强烈建议你按顺序阅读,因为很多概念都需要前面的章节作为基础。大多数章节都有几个小测验,帮助你学习和掌握这些内容。
第一部分包括3章,旨在帮助你初步使用Java 8。学完这一部分,你将会对Lambda表达式有充分的了解,并可以编写简洁而灵活的代码,能够轻松适应不断变化的需求。
在第1章中,我们总结了Java的主要变化(Lambda表达式、方法引用、流和默认方法),并为学习后面的内容做好准备。
在第2章中,你将了解行为参数化,这是Java 8非常依赖的一种软件开发模式,也是引入Lambda表达式的主要原因。
第3章全面地解释了Lambda表达式和方法引用,每一步都有代码示例和测验。
第二部分仔细讨论了新的Stream API。学完这一部分,你将充分理解流是什么,以及如何在Java应用程序中使用它们来简洁而高效地处理数据集。
第4章介绍了流的概念,并解释它们与集合有何异同。
第5章详细讨论了表达复杂数据处理查询可以使用的流操作。我们会谈到很多模式,如筛选、切片、查找、匹配、映射和归约。
第6章讲到了收集器——Stream API的一个功能,可以让你表达更为复杂的数据处理查询。
在第7章中,你将了解流如何得以自动并行执行,并利用多核架构的优势。此外,你还会学到为正确而高效地使用并行流,要避免的若干陷阱。
第三部分探讨了能让你高效使用Java 8并在代码中运用现代语汇的若干内容。
第8章探讨了如何利用Java 8的新功能和一些秘诀来改善你现有的代码。此外,该章还探讨了一些重要的软件开发技术,如设计模式、重构、测试和调试。
在第9章中,你将了解到默认方法是什么,如何利用它们来以兼容的方式演变API,一些实际的应用模式,以及有效使用默认方法的规则。
第10章谈到了新的
java.util.Optional
类,它能让你设计出更好的API,并减少空指针异常。第11章探讨了
CompletableFuture
,它可以让你用声明性方式表达复杂的异步计算,从而让Stream API的设计并行化。第12章探讨了新的日期和时间API,这相对于以前涉及日期和时间时容易出错的API是一大改进。
在本书最后一部分,我们会返回来谈谈怎么用Java编写高效的函数式程序,还会将Java 8的功能和Scala作一比较。
第13章是一个完整的函数式编程教程,介绍了一些术语,并解释了如何在Java 8中编写函数式风格的程序。
第14章涵盖了更高级的函数式编程技巧,包括高阶函数、科里化、持久化数据结构、延迟列表和模式匹配。你可以把这一章看作一种融合,既有可以用在代码库中的实际技术,也有让你成为更渊博的程序员的学术知识。
第15章对比了Java 8的功能与Scala的功能。Scala和Java一样,是一种实施在JVM上的语言,近年来迅速发展,在编程语言生态系统中已经威胁到了Java的一些方面。
在第16章我们会回顾这段学习Java 8并慢慢走向函数式编程的历程。此外,我们还会猜测,在Java 8之后,未来可能还有哪些增强和新功能出现。
最后,本书有四个附录,涵盖了与Java 8相关的其他一些话题。附录A总结了本书未讨论的一些Java 8的小特性。附录B概述了Java库的其他主要扩展,可能对你有用。附录C是第二部分的延续,谈到了流的高级用法。附录D探讨了Java编译器在幕后是如何实现Lambda表达式的。
代码惯例和下载
所有代码清单和正文中的源代码都采用等宽字体(如fixed-widthfontlikethis
),以与普通文字区分开来。许多代码清单中都有注释,突出了重要的概念。
书中所有示例代码和执行说明均可见于https://github.com/java8/Java8InAction。你也可以从出版商网站(https://www.manning.com/java8inaction)下载包含本书所有示例的zip文件。
作者在线
购买本书即可免费访问Manning Publications运营的一个私有在线论坛,你可以在那里发表关于本书的评论、询问技术问题,并获得作者和其他用户的帮助。如欲访问作者在线论坛并订阅,请用浏览器访问https://www.manning.com/java8inaction。这个页面说明了注册后如何使用论坛,能获得什么类型的帮助,以及论坛上的行为守则。
Manning对读者的承诺是提供一个平台,供读者之间以及读者和作者之间进行有意义的对话。但这并不意味着作者会有任何特定程度的参与。他们对论坛的贡献是完全自愿的(且无报酬)。我们建议你试着询问作者一些有挑战性的问题,以免他们失去兴趣!
只要本书仍在印,你就可以在出版商网站上访问作者在线论坛和先前所讨论内容的归档文件。