10. 附录
本文介绍如何在 Windows 7 至 10 系统上安装本文档中使用的工具。读者可根据自身环境进行调整。
10.1. 安装 JDK
在 URL(2016年4月)中,可找到最新的 JDK。 下文将把 JDK 的安装目录称为 <jdk-install>。
![]() |
10.2. 安装 SDK Android 管理器
![]() |
- 在 [1] 中,为什么需要 Android 的 SDK;
可在 [https://developer.android.com/studio/index.html#downloads](2016年5月)中找到 SDK Android 管理器。
![]() |
安装 SDK Manager。我们将其安装目录记为 <sdk-manager-install>。启动该程序。
该项目已配置为(参见第 9.3.2 节):
- SDK API 23 [2];
- SDK Build-tools 23.0.3 [3];
- SDK Tool 25.1.3 [4]
请确保已下载这些组件。
10.3. 安装 Genymotion 模拟器管理器
Android 随附的模拟器运行缓慢,这让人不愿使用它们。 [Genymotion] 公司提供了一款高性能的模拟器。该模拟器可在 URL [https://cloud.genymotion.com/page/launchpad/download/](2016年5月)中获取。
您需要注册才能获取个人使用版。请下载 [Genymotion] 产品及配套虚拟机 VirtualBox:

接下来我们将 [Genymotion] 的安装文件夹称为 <genymotion-install>。运行 [Genymotion]。然后下载一个平板电脑镜像:
![]() |
- 在 [1] 中,添加 [2] 中所述的虚拟终端;
10.4. 安装 IDE IntellijIDEA 社区版
IDE [ Intellij IDEA Community Edition] 可在 URL [https://www.jetbrains.com/idea/#chooseYourEdition] 中获取:
![]() |
安装 IDE 后运行该程序。
![]() | ![]() |
- 在 [1-2] 中配置插件;
- 在 [3-4] 中,将插件 [Genymotion] 添加到 IDE 中;
![]() |
- 在 [6-7] 中,配置 IDE;
![]() | ![]() |
- 为 [8-9],指定 [Genymotion] 模拟器管理器的安装目录;
![]() |
- 在 [12-13] 中,配置项目的默认类型;
![]() | ![]() |
![]() |
- 在 [14-16] 中,配置 JDK;
![]() |
![]() | ![]() |
- 在 [17-20] 中,配置 Android 的 SDK;
![]() |
- 在 [21-22] 中,指定 JDK 为项目的默认值;
![]() | ![]() |
![]() |
- 在 [23-27] 中,禁用默认针对英语的拼写检查;
![]() | ![]() |
- 在 [28-32] 中,选择您想要的键盘快捷键类型。您可以保留 IntelliJ 的默认设置,或选择您更习惯的 IDE 中的其他设置;
![]() |
- 在 [33-35] 中,配置 IDE 以支持多项目。它可以在同一窗口或不同窗口中管理多个项目;
![]() |
- 在 [36-37] 中,默认启用行号功能。这将帮助您快速定位引发异常的行;
10.5. 示例的使用
示例中的 IntellijIDEA 项目可在 |ICI| 中获取。第 1.3 节说明了如何打开它们。
10.6. 在 Java 中管理 jSON
[Spring MVC]框架在开发者完全不知情的情况下,会调用JSON库。为了说明什么是JSON (JavaScript 对象表示法),我们在此展示一个程序,该程序将对象序列化为 JSON,并通过反序列化生成的 JSON 字符串来还原初始对象。
“Jackson”库可用于构建:
- 对象的 JSON 字符串:new ObjectMapper().writeValueAsString(object);
- 根据字符串 JSON 创建对象:new ObjectMapper().readValue(jsonString, Object.class)。
这两种方法都可能引发 IOException 异常。以下是一个示例。
![]() |
上述项目是一个Maven项目,包含以下文件:[pom.xml];
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>json</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>
- 第12-16行:引入“Jackson”库的依赖项;
[Personne] 类如下:
package istia.st.json;
public class Personne {
// 数据
private String nom;
private String prenom;
private int age;
// 构造函数
public Personne() {
}
public Personne(String nom, String prénom, int âge) {
this.nom = nom;
this.prenom = prénom;
this.age = âge;
}
// 签名
public String toString() {
return String.format("Personne[%s, %s, %d]", nom, prenom, age);
}
// 获取器和设置器
...
}
[Main] 类如下:
package istia.st.json;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
// 序列化/反序列化工具
static ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
// 创建人员
Personne paul = new Personne("Denis", "Paul", 40);
// JSON 显示
String json = mapper.writeValueAsString(paul);
System.out.println("Json=" + json);
// 根据 JSON 实例化 Personne
Personne p = mapper.readValue(json, Personne.class);
// 显示人员
System.out.println("Personne=" + p);
// 一个数组
Personne virginie = new Personne("Radot", "Virginie", 20);
Personne[] personnes = new Personne[]{paul, virginie};
// JSON 显示
json = mapper.writeValueAsString(personnes);
System.out.println("Json personnes=" + json);
// 字典
Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
hpersonnes.put("1", paul);
hpersonnes.put("2", virginie);
// 显示 JSON
json = mapper.writeValueAsString(hpersonnes);
System.out.println("Json hpersonnes=" + json);
}
}
执行该类将显示以下屏幕内容:
从该示例中需注意:
- 对象 [ObjectMapper] 是转换 JSON / Object 所必需的:第 11 行;
- 转换 [Personne] --> JSON:第 17 行;
- 转换 JSON --> [Personne]:第 20 行;
- 由这两个方法触发的异常 [IOException]:第 13 行。
目录
1 引言 5
1.2Les所用工具 6
1.3Les示例代码 6
2一个入门示例 9
2.1L示例应用程序架构 9
2.2L可执行文件 9
2.3L'同步接口 11
2.4L'同步调用 12
2.5Tests 同步调用 13
2.6L'异步接口及其实现 14
2.7L'异步调用 16
2.8Tests 异步调用 19
2.8.1avec 调度程序 [Schedulers.io] 20
2.8.2avec 调度器 [Schedulers.computation] 20
2.8.3avec 排程 [Schedulers.newThread] 21
2.8.4avec 调度器 [Schedulers.trampoline, Schedulers.immediate] 22
2.9Cas 限制 22
3泛型类和方法的签名 27
4Java 8中的lambda表达式 32
4.1Exemple-01 - 函数式接口与lambda表达式 32
4.2Exemple-02 - 函数式接口 Predicate<T> 34
4.3Exemple-03 - 函数式接口 Function<T,R> 37
4.4Exemple-04 - 函数式接口 Consumer<T> 38
4.5Exemple-05 - 函数接口 BiConsumer<T,U> 40
4.6Exemple-06 - 函数接口 BiFunction<T,U,R> 41
4.7Exemple-07 - Supplier<T> 功能接口 43
5Java 8 中的 Stream<T> 类型 45
5.1Exemple-01 - Stream 类 45
5.2Exemple-02 - Stream 元素的并行处理 47
5.3Exemple-03 - 流元素的并行处理 48
5.4Exemple-04 - 过滤流 50
5.5Exemple-05 - 基于一个 Stream<T1> 创建一个 Stream<T2> 52
5.6Exemple-06 - Stream<T> 类的其他方法 53
5.6.1[findFirst] 54
5.6.2[findAny] 55
5.6.3[skip] 56
5.6.4[limit] 58
5.6.5[count] 59
5.6.6[max, min] 60
5.6.7[reduce] 63
5.6.8[sorted] 63
5.6.9[anyMatch, noneMatch, allMatch] 65
5.6.10[collect(Collectors.groupingBy)] 65
5.6.11[distinct] 67
5.6.12[flatMap] 68
5.6.13 素数流方法 71
6RxJava库的功能接口 72
6.1Exemple-01:[Action0]功能接口 72
6.2Exemple-02, 03:功能接口 [Actioni] 73
6.3Exemple-04, 05:功能接口 [Funci] 74
7RxJava库 77
7.1 创建可观察对象并订阅 77
7.1.1Exemple-01:[Observable.from]方法 77
7.1.2Exemple-03:Observer 类 82
7.1.3Exemple-04:[Observable.create]方法 84
7.1.4Exemple-05:[Exemple-04]的重构 86
7.2Thread 执行,观察线程 88
7.2.1Exemple-06:位于 [main] 之外的线程中的被观察者和观察者 88
7.2.2Exemple-07:位于两个不同线程中的可观察对象与观察者 90
预定义的 7.3Observables 92
7.3.1Exemple-08:方法 [Observable.range] 92
7.3.2Exemple-09:Observable.[interval, take, doNext]方法 96
7.3.3Exemples-10/12:Observable.[error, empty, never] 方法 98
7.4.1Exemple-13:操作线程、观察线程 103
7.5Combinaisons 包含多个观测量 106
7.5.1Exemple-14:使用 [Observable.merge] 合并两个可观测量 106
7.5.2Exemple-15:使用 [Observable.concat] 连接两个可观测量 108
7.5.3Exemple-16:将两个可观察量与 [Observable.zip] 组合 109
7.5.4Exemple-17:使用 [Observable.combineLatest] 组合两个可观测量 111
7.5.5Exemple-18:将两个可观测量与 [Observable.amb] 组合 113
7.6 可观测量的处理链 114
7.6.1Exemple-19:使用 [Observable.map] 转换可观察对象 114
7.6.2Exemple-20:使用 [Observable.filter] 对可观察对象进行过滤 116
7.6.3Exemple-21:使用 [Observable.flapMap] 转换可观察对象 117
7.6.4Exemples-22:[Observable]类的其他方法 123
7.7Les 调度器 127
7.7.1Exemple-23:[Schedulers.computation] 调度程序 127
7.7.2Exemple-24:调度程序 [Schedulers.io] 128
7.7.3Exemple-25:调度程序 [Schedulers.newThread] 129
7.7.4Exemple-26:调度程序 [Schedulers.immediate, Schedulers.trampoline] 130
7.8Conclusion 133
8RxJava在Swing环境中的应用 134
8.1Introduction 134
8.2La 代码结构 135
8.3 项目执行 136
8.4Le 同步服务 136
8.5Le 异步服务 139
8.6L图形界面 141
8.7Instanciation 图形用户界面 143
8.8 执行同步查询 144
8.9 异步请求的执行 145
9 Android 环境中的 RxJava 149
9.1Introduction 149
9.2Le Web 服务 / jSON 149
9.2.1Le IntelliJ IDEA 项目 150
9.2.2Les 项目的 Gradle 依赖项 151
9.2.3La 层 [métier] 153
9.2.4Le Web 服务 / JSON 156
9.2.5Configuration Spring 项目 160
9.2.6 运行 Web 服务器 161
9.3Le Android客户端 161
9.3.1RxAndroid 161
9.3.2Le IntelliJ IDEA 项目 162
9.3.3 运行 IntelliJ IDEA 项目 164
9.3.4Les 项目的 Gradle 依赖项 166
9.3.5Le Android 应用清单 167
9.3.6La 层 [DAO] 168
9.3.6.1L 层 [IDao] 接口 168
9.3.6.2 [DAO] 层的实现 170
9.3.7Les 应用程序视图 172
9.3.7.1La 类 [MyFragment] 174
9.3.7.2Le 查询片段 [RequestFragment] 176
9.3.7.3Le 响应片段 [ResponseFragment] 177
9.3.7.4L Android 活动 [MainActivity] 178
9.3.7.5Le 片段 [RequestFragment] 185
9.3.7.6Le 片段 [ResponseFragment] 187
9.3.8Les 可观测量示例 190
9.3.8.6Pour 继续 202
9.3.9Conclusion 202
10附件 203
10.1Installation 由 JDK 生成 203
10.2Installation 来自 SDK Android 管理器 203
10.3Installation 来自 Genymotion 模拟器管理器 204
10.4Installation(来自 IDE)IntellijIDEA 社区版 205
示例中的 10.5Utilisation 210
10.6Gestion(基于 jSON 的 Java 版本) 211

























