反应式编程已经存在了几十年。从 Smalltalk 还是一种年轻的语言时起,就有一些反应式编程的实现。然而,它只是最近才流行起来,现在正成为一种趋势。你为什么现在问?因为它有助于编写快速、实时的应用,而当前的技术和 Web 都需要它。
我早在 2008 年就参与了这项工作,当时我所在的团队正在开发一个名为 Sophie 2 的多媒体图书创作者。它必须快速且响应迅速,因此我们创建了一个名为 Prolib 的框架,该框架为对象提供了相互依赖的属性(换句话说,我们实现了 Swing 和更多转换、过滤等的绑定)。像这样将模型数据连接到 GUI 感觉很自然。
当然,这与 RX 附带的功能性方法相去甚远。2010 年,微软发布了 RX,之后,Netflix 将其移植到 JavaRxJava。然而,Netflix 向开源社区发布了 RxJava,该项目获得了巨大成功。许多其他语言都有自己的 RX 端口和许多替代端口。现在,您可以在 Java 后端使用反应式编程进行编码,并将其连接到 RxJava 的前端。
这本书试图向您解释什么是反应式编程,以及如何在 RxJava 中使用它。它有许多小示例,并以小步骤解释概念和 API 细节。阅读本书后,您将对 RxJava、函数式编程和反应式范例有一个概念。
第一章反应式编程简介将向您介绍反应式编程的概念,并告诉您为什么要学习它。本章包含的示例演示了 RxJava 如何结合反应式编程概念。
第 2 章使用 Java 8的函数结构,教您如何使用 Java 8 新的 lambda 结构。它将解释一些函数式编程概念,并向您展示如何在反应式程序中与 RxJava 一起使用它们。
第 3 章创建并连接观察者、观察者和受试者,将向您展示名为“观察者”的 RxJava 库的基本构建块。您将了解“热”和“冷”观测值之间的区别,以及如何使用订阅实例订阅和取消订阅它们。
第 4 章转换、过滤和积累您的数据,将引导您了解基本的反应运算符,您将学习如何使用这些运算符实现逐步计算。本章将向您介绍如何转换可观察物发出的事件,如何仅过滤我们需要的数据,以及如何对其进行分组、积累和处理。
第 5 章、组合符、条件和错误处理将向您展示更复杂的反应运算符,这将允许您掌握可观察的链接。您将了解组合运算符和条件运算符,以及观察对象如何相互作用。本章演示了错误处理的不同方法。
第 6 章使用与调度器的并发和并行将指导您完成使用 RxJava 编写并发和并行程序的过程。这将由 RxJava 调度器完成。将介绍调度器的类型,您将了解何时以及为什么使用每种调度器。本章将向您介绍如何避免和施加背压的机制。
第 7 章测试 RxJava 应用将向您展示如何对 RxJava 应用进行单元测试。
第 8 章资源管理和扩展 RxJava将教您如何管理 RxJava 应用用作数据源的资源。我们将在这里写下我们自己的可观测算符。
为了运行这些示例,您需要:
- 已安装 Java 8,可从 Oracle 网站下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- Gradle 将构建 project-2.x,您可以从下载 https://gradle.org/downloads
- Eclipse 打开项目。您还需要 Eclipse 的 Gradle 插件,该插件可以从 Eclipse 市场下载。当然,您可以从命令行使用 Gradle,并使用 Vim 或任何其他任意文本编辑器浏览代码
如果您是一名 Java 开发人员,知道如何编写软件,并且希望学习如何将现有技能应用于反应式编程,那么本书适合您。
这本书可以帮助任何人,无论他们是初学者,高级程序员,甚至是专家。您不需要对 Java8 的 lambdas 和 streams 或 RxJava 有任何经验。
在本书中,您将发现许多文本样式可以区分不同类型的信息。下面是这些风格的一些例子,并解释了它们的含义。
文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄如下所示:“我们可以通过使用include
指令来包含其他上下文。”
代码块设置如下:
Observable
.just('R', 'x', 'J', 'a', 'v', 'a')
.subscribe(
System.out::print,
System.err::println,
System.out::println
);
当我们希望提请您注意代码块的特定部分时,相关行或项目以粗体显示:
Observable<Object> obs = Observable
.interval(40L, TimeUnit.MILLISECONDS)
.switchMap(v ->
Observable
.timer(0L, 10L, TimeUnit.MILLISECONDS)
.map(u -> "Observable <" + (v + 1) + "> : " + (v + u)))
);
subscribePrint(obs, "switchMap");
新术语和重要词语以粗体显示。您在屏幕上看到的单词(例如,在菜单或对话框中)在文本中显示如下:“这种类型的接口称为功能接口
警告或重要注释显示在这样的框中。
提示和技巧如下所示。
我们欢迎读者的反馈。让我们知道你对这本书的看法你喜欢还是不喜欢。读者反馈对我们来说很重要,因为它可以帮助我们开发出您将真正从中获得最大收益的标题。
要向我们发送总体反馈,只需发送电子邮件<[feedback@packtpub.com](mailto:feedback@packtpub.com)>
,并在邮件主题中提及该书的标题。
如果您对某个主题有专业知识,并且您有兴趣撰写或贡献一本书,请参阅我们的作者指南www.packtpub.com/authors。
既然您是一本 Packt 图书的骄傲拥有者,我们有很多东西可以帮助您从购买中获得最大收益。
您可以从您的账户下载示例代码文件 http://www.packtpub.com 对于您购买的所有 Packt 出版书籍。如果您在其他地方购买了本书,您可以访问http://www.packtpub.com/support 并注册,将文件直接通过电子邮件发送给您。
虽然我们已尽一切努力确保内容的准确性,但错误确实会发生。如果您在我们的一本书中发现错误,可能是文本或代码中的错误,如果您能向我们报告,我们将不胜感激。通过这样做,您可以使其他读者免于沮丧,并帮助我们改进本书的后续版本。如果您发现任何错误,请访问进行报告 http://www.packtpub.com/submit-errata ,选择您的书籍,点击勘误表提交表链接,输入您勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上载到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。
要查看之前提交的勘误表,请转至https://www.packtpub.com/books/content/support 并在搜索字段中输入图书名称。所需信息将出现在勘误表部分下。
在互联网上盗版版权材料是所有媒体都面临的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现任何形式的非法复制品,请立即向我们提供地址或网站名称,以便我们采取补救措施。
请致电<[copyright@packtpub.com](mailto:copyright@packtpub.com)>
与我们联系,并提供可疑盗版材料的链接。
我们感谢您在保护我们的作者方面提供的帮助以及我们为您带来有价值内容的能力。
如果您对本书的任何方面有任何问题,可以通过<[questions@packtpub.com](mailto:questions@packtpub.com)>
与我们联系,我们将尽力解决该问题。