关于本书

关于本书

简单地说,Java 8中的新增功能以及Java 9引入的变化(虽然并不显著)是自Java 1.0发布21年以来,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 9的更新包括一个支持通过Flow API进行反应式编程的模块系统,以及其他各种增强功能。

别急,这只是一个概览,现在该让你自己去看看本书了。

本书结构

本书分为六个部分,分别是:“基础知识”“使用流进行函数式数据处理”“使用流和Lambda进行高效编程”“无所不在的Java”“提升Java的并发性”和“函数式编程以及Java未来的演进”。我们强烈建议你按顺序阅读前两部分的内容,因为很多概念都需要前面的章节作为基础,后面四个部分的内容你可以按照任意顺序阅读。大多数章节都附有几个测验,可以帮助你学习和掌握这些内容。

第一部分旨在帮助你初步使用Java 8。学完这一部分,你将会对Lambda表达式有充分的了解,并可以编写简洁而灵活的代码,能够轻松适应不断变化的需求。

  • 第1章总结Java的主要变化(Lambda表达式、方法引用、流和默认方法),为学习后面的内容做准备。
  • 第2章介绍行为参数化,这是Java 8非常依赖的一种软件开发模式,也是引入Lambda表达式的主要原因。
  • 第3章对Lambda表达式和方法引用进行全面介绍,每一步都提供了代码示例和测验。

第二部分详细讨论新的Stream API。通过Stream API,你将能够写出功能强大的代码,以声明性方式处理数据。学完这一部分,你将充分理解流是什么,以及如何在Java应用程序中使用它们来简洁而高效地处理数据集。

  • 第4章介绍流的概念,并解释它们与集合有何异同。
  • 第5章详细讨论为了表达复杂的数据处理查询可以使用的流操作。其间会谈到很多模式,如筛选、切片、查找、匹配、映射和归约。
  • 第6章介绍收集器——Stream API的一个功能,可以让你表达更为复杂的数据处理查询。
  • 第7章探讨流如何得以自动并行执行,并利用多核架构的优势。此外,你还会学到为正确而高效地使用并行流,要避免的若干陷阱。

第三部分探索Java 8和Java 9的多个主题,这些主题中的技巧能让你的Java代码更高效,并能帮助你利用现代的编程习语改进代码库。这一部分的出发点是介绍高级编程思想,本书后续内容并不依赖于此。

  • 第8章是这一版新增的,探讨Java 8和Java 9对Collection API的增强。内容涵盖如何使用集合工厂,如何使用新的惯用模式处理ListSet,以及使用Map的惯用模式。
  • 第9章探讨如何利用Java 8的新功能和一些秘诀来改善你现有的代码。此外,该章还探讨了一些重要的软件开发技术,如设计模式、重构、测试和调试。
  • 第10章也是这一版新增的,介绍依据领域特定语言(domain-specific language,DSL)实现API的思想。这不仅是一种强大的API设计方法,而且正变得越来越流行。Java中已经有API采用这种模式实现,譬如ComparatorStream以及Collector接口。

第四部分介绍Java 8和Java 9中新增的多个特性,这些特性能帮助程序员事半功倍地编写代码,让程序更加稳定可靠。我们首先从Java 8新增的两个API入手。

  • 第11章介绍java.util.Optional类,它能让你设计出更好的API,并减少空指针异常。
  • 第12章探讨新的日期和时间API,这相对于以前涉及日期和时间时容易出错的API是一大改进。
  • 第13章讨论默认方法是什么,如何利用它们来以兼容的方式演变API,一些实际的应用模式,以及有效使用默认方法的规则。
  • 第14章是这一版新增的,探讨Java的模块系统——它是Java 9的主要改进,使大型系统能够以文档化和可执行的方式进行模块化,而不是简单地将一堆包杂乱无章地堆在一起。

第五部分探讨如何使用Java的高级特性构建并发程序——注意,我们要讨论的不是第6章和第7章中介绍的流的并发处理。

  • 第15章是这一版新增的,从宏观的角度介绍异步API的思想,包括Future、反应式编程背后的“发布–订阅”协议(封装在Java 9的Flow API中)。
  • 第16章探讨CompletableFuture,它可以让你用声明性方式表达复杂的异步计算,从而让Stream API的设计并行化。
  • 第17章也是这一版新增的,详细介绍Java 9的Flow API,并提供反应式编程的实战代码解析。

第六部分是本书最后一部分,我们会谈谈怎么用Java编写高效的函数式程序,还会将Java的功能和Scala做比较。

  • 第18章是一个完整的函数式编程教程,会介绍一些术语,并解释如何在Java 8中编写函数式风格的程序。
  • 第19章涵盖更高级的函数式编程技巧,包括高阶函数、柯里化、持久化数据结构、延迟列表和模式匹配。这一章既提供了可以用在代码库中的实际技术,也提供了能让你成为更渊博的程序员的学术知识。
  • 第20章将对比Java与Scala的功能。Scala和Java一样,是一种在JVM上实现的语言,近年来发展迅速,在编程语言生态系统中已经威胁到了Java的一些方面。
  • 第21章会回顾这段学习Java 8并慢慢走向函数式编程的历程。此外,我们还会猜测,在Java 8、9以及10中添加的小功能之后,未来可能会有哪些增强和新功能出现。

最后,本书有四个附录,涵盖了与Java 8相关的其他一些话题。附录A总结了本书未讨论的一些Java 8的小特性。附录B概述了Java库的其他主要扩展,可能对你有用。附录C是第二部分的延续,介绍了流的高级用法。附录D探讨了Java编译器在幕后是如何实现Lambda表达式的。

关于代码

所有代码清单和正文中的源代码都采用等宽字体(如fixed-widthfontlikethis),以与普通文字区分开来。许多代码清单中都有注释,突出了重要的概念。

书中示例的源代码请至图灵社区本书主页http://ituring.cn/book/2659“随书下载”处下载。

本书论坛

购买了英文版的读者可免费访问Manning出版社运营的一个私有在线论坛,你可以在那里发表对图书的评论、询问技术问题,并获得作者和其他用户的帮助,网址为:https://forums.manning.com/forums/modern-java-in-action。如欲了解Manning论坛以及论坛上的行为守则,请访问https://forums.manning.com/forums/about

Manning对读者的承诺是提供一个平台,供读者之间以及读者和作者之间进行有意义的对话。但这并不意味着作者会有任何特定程度的参与。他们对论坛的贡献是完全自愿的(且无报酬)。我们建议你试着询问作者一些有挑战性的问题,以免他们失去兴趣。只要书仍在发行,你就可以在出版商网站上访问作者在线论坛和先前所讨论内容的归档文件。

读者也可登录图灵社区本书主页http://ituring.cn/book/2659提交反馈意见和勘误。

电子书

扫描如下二维码,即可购买本书电子版。

目录

  • 版权声明
  • 对本书上一版的赞誉
  • 前言
  • 致谢
  • 关于本书
  • 关于封面图片
  • 第一部分 基础知识
  • 第 1 章 Java 8、9、10以及11的变化
  • 第 2 章 通过行为参数化传递代码
  • 第 3 章 Lambda表达式
  • 第二部分 使用流进行函数式数据处理
  • 第 4 章 引入流
  • 第 5 章 使用流
  • 第 6 章 用流收集数据
  • 第 7 章 并行数据处理与性能
  • 第三部分 使用流和Lambda进行高效编程
  • 第 8 章 Collection API的增强功能
  • 第 9 章 重构、测试和调试
  • 第 10 章 基于Lambda的领域特定语言
  • 第四部分 无所不在的Java
  • 第 11 章 用Optional取代null
  • 第 12 章 新的日期和时间API
  • 第 13 章 默认方法
  • 第 14 章 Java模块系统
  • 第五部分 提升Java的并发性
  • 第 15 章 CompletableFuture及反应式编程背后的概念
  • 第 16 章 CompletableFuture:组合式异步编程
  • 第 17 章 反应式编程
  • 第六部分 函数式编程以及Java未来的演进
  • 第 18 章 函数式的思考
  • 第 19 章 函数式编程的技巧
  • 第 20 章 面向对象和函数式编程的混合:Java和Scala的比较
  • 第 21 章 结论以及Java的未来
  • 附录 A 其他语言特性的更新
  • 附录 B 其他类库的更新
  • 附录 C 如何以并发方式在同一个流上执行多种操作
  • 附录 D Lambda表达式和JVM字节码