164.md 5.7 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4
# RxJava 教程

> 原文: [https://howtodoinjava.com/library/rxjava-tutorial/](https://howtodoinjava.com/library/rxjava-tutorial/)

W
wizardforcel 已提交
5
[RxJava 2.0](http://reactivex.io/) 是 Java 的开源扩展,用于 NetFlix 的异步编程。 如 [Java8 lambda 表达式](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/)中所示,它与函数式编程更加接近。 反应代码的基本构建块是*可观察对象**订阅者*`Observable`发出项目; `Subscriber`消耗这些项目。
W
wizardforcel 已提交
6

W
wizardforcel 已提交
7
RxJava 看起来也像[观察者设计模式](https://howtodoinjava.com/design-patterns/behavioral/observer-design-pattern/),但有所不同 – 可观察对象通常不会开始发布项目,除非有人明确订阅它们。
W
wizardforcel 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21

```java
Table of Contents

1\. What is RxJava and Reactive Programming
2\. RxJava 2 Dependency
3\. Transformation
4\. Conclusion
```

## 1.什么是 RxJava 和响应式编程

**反应式编程**是一个通用的编程术语,着重于对诸如数据值或事件之类的变化做出反应。 回调是命令式完成反应式编程的一种方法。

W
wizardforcel 已提交
22
例如,如果您有一个数据源(生产者)和一个数据目标(消费者); 然后,在将消费者连接到订阅者之后,反应式编程框架负责将生产者生成的数据推送到消费者。 请注意,一个可观察对象可以有任意数量的订阅者。
W
wizardforcel 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

让我们看一个非常基本的 **RxJava hello world 示例**

```java
package com.howtodoinjava.app;

import io.reactivex.Observable;
import io.reactivex.functions.Consumer;

public class RxJava2Example 
{
      public static void main(String[] args) 
      {     
            //producer
            Observable<String> observable = Observable.just("how", "to", "do", "in", "java");

            //consumer
            Consumer<? super String> consumer = System.out::println;

            //Attaching producer to consumer
            observable.subscribe(consumer);
      }
}

```

W
wizardforcel 已提交
49
在上面的示例中,`"how", "to", "do", "in", "java"`可被视为事件流。 为这些事件创建了`observable`。 然后,我们创建一个可以对这些单词起作用的`consumer`- 在这种情况下,它只是将它们打印出来以供控制台使用。 该消费者不过是`subscriber`
W
wizardforcel 已提交
50

W
wizardforcel 已提交
51
最后,我们使用`subscribe()`将订阅者连接到消费者。 一旦我们将两者连接起来,单词/事件就开始流动,订阅者开始在控制台中打印它们。
W
wizardforcel 已提交
52

W
wizardforcel 已提交
53
在代码内部,当从可观察对象发出新单词时,将在每个订阅者上调用`onNext()`方法。 当可观察的单词成功完成或出现错误时,将在订阅者上调用`onComplete()``onError()`方法。
W
wizardforcel 已提交
54

W
wizardforcel 已提交
55
## 2\. RxJava 2 依赖项
W
wizardforcel 已提交
56 57 58

要将 RxJava 2.0 包含到项目运行时中,可以在给定的 maven 配置,gradle 配置或 jar 文件添加到类路径中进行选择。

W
wizardforcel 已提交
59
#### 2.1 RxJava 2.0 Maven 依赖关系
W
wizardforcel 已提交
60 61 62 63 64 65 66 67 68 69 70

```java
<!-- https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava -->
<dependency>
      <groupId>io.reactivex.rxjava2</groupId>
      <artifactId>rxjava</artifactId>
      <version>2.1.0</version>
</dependency>

```

W
wizardforcel 已提交
71
#### 2.2 RxJava 2.0 Gradle 依赖关系
W
wizardforcel 已提交
72 73 74 75 76 77

```java
compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.1.0'

```

W
wizardforcel 已提交
78
#### 2.3 RxJava 2.0 Jar 依赖关系
W
wizardforcel 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98

[下载 RxJava 2.0 Jar 文件链接](http://central.maven.org/maven2/io/reactivex/rxjava2/rxjava/2.1.0/rxjava-2.1.0.jar)

## 3\. RxJava 中的转换

在 RxJava 中,订阅者从可观察到的事件类型与订阅者发出的事件类型不需要相同。 它们可以包含的数据,数据类型或接收到的事件和发出的事件之间的任何其他主要差异是不同的。

这是为源和目标之间的事件的中间*转换提供支持的必要条件,以便两者都能按其设计的方式工作并且仍然兼容。 与[适配器设计模式](//howtodoinjava.com/2014/05/10/adapter-design-pattern-in-java/)非常相似。*

让我们举个例子。 在我们的 hello world 示例中,我们要以大写形式打印单词。 这是一个简单的转换,但是您会明白的。

```java
Observable<String> observable = Observable.just("how", "to", "do", "in", "java");
Consumer<? super String> consumer = System.out::println;

//Transformation using map() method
observable.map(w -> w.toUpperCase()).subscribe(consumer);

```

W
wizardforcel 已提交
99
在上面的示例中,我们在订阅可观察对象之前添加了一种中间方法`map()`。 因此,每个单词都首先通过`map()`方法,然后再传递给订阅者以进行进一步处理。 这称为转换。
W
wizardforcel 已提交
100

W
wizardforcel 已提交
101
如前所述,您还可以在转换过程中更改事件的数据类型。 例如:
W
wizardforcel 已提交
102 103 104 105 106 107 108 109 110

```java
Observable<String> observable = Observable.just("how", "to", "do", "in", "java");
Consumer<? super Integer> consumer = System.out::println;

observable.map(w -> w.toUpperCase().hashCode()).subscribe(consumer); 

```

W
wizardforcel 已提交
111
在此程序中,我们遍历单词,然后在转换中获得单词的哈希码并将其传递给订阅者,后者在控制台中打印该哈希码。 因此,在这里,我们将连接可观察对象(它发出字符串)和订阅者(它接受整数)。
W
wizardforcel 已提交
112

W
wizardforcel 已提交
113
## 4\. 结论
W
wizardforcel 已提交
114

W
wizardforcel 已提交
115
可观察的方式和订阅者之间的松散连接,为开发人员带来了很大的优势。 他们不需要考虑整个并发示例,对于我们许多人来说,这已经是艰巨的任务。 您只需连接制作人和订阅者 - 一切都将完美无缺地进行。
W
wizardforcel 已提交
116 117 118 119 120 121

另外,您无需同时考虑可观察者和订阅者。 您可以使用最佳设计选择独立地开发它们,然后使用转换概念将它们连接起来。 太好了!

**RxJava 教程**是 RxJava 的**简介。 我将在即将到来的 **rxjava 初学者教程**中更深入地介绍与**反应式编程教程**相关的重要概念。**

学习愉快!