# RxJava 教程

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

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

RxJava 看起来也像[观察者设计模式](https://howtodoinjava.com/design-patterns/behavioral/observer-design-pattern/)，但有所不同 – 可观察对象通常不会开始发布项目，除非有人明确订阅它们。

```java
Table of Contents

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

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

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

例如，如果您有一个数据源（生产者）和一个数据目标（消费者）； 然后，在将消费者连接到订阅者之后，反应式编程框架负责将生产者生成的数据推送到消费者。 请注意，一个可观察对象可以有任意数量的订阅者。

让我们看一个非常基本的 **RxJava helloworld 示例**。

```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);
      }
}

```

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

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

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

## 2\. RxJava2 依赖项

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

#### 2.1 RxJava 2.0 Maven 依赖关系

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

```

#### 2.2 RxJava 2.0 Gradle 依赖关系

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

```

#### 2.3 RxJava 2.0 Jar 依赖关系

[下载 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/)非常相似。

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

```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);

```

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

如前所述，您还可以在转换过程中更改事件的数据类型。 例如：

```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); 

```

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

## 4\. 结论

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

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

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

学习愉快！