RxJava 2.0 入门教程

RxJava 2.0 是来自NetFlix的开源java异步编程框架。和java 8 lambda表达式很接近,响应式编程的基本构建快是被观察对象(Observable)和订阅者(Subscriber)。被观察者发出信息项,订阅者消费它们。

RxJava 也类似于观察者模式——但不同的是,直到明确有订阅者订阅时,被观察者才发出信息。

什么是响应式编程

响应式编程是个通用编程术语,其聚焦变化,如数据值或事件变化。回调是响应式编程必用的方法。
假如你有一数据源(生产者)和数据目标(消费者),那么连接两者之后——响应式编程框架负责推有生产者产生的数据给消费者。请注意,一个被观察者可以有任意数量的订阅者。

下面看最简单RxJava的hello world示例:

package com.howtodoinjava.app;import io.reactivex.Observable;
import io.reactivex.functions.Consumer;public class RxJava2Example
{public static void main(String[] args){  //producerObservable<String> observable = Observable.just("how", "to", "do", "in", "java");//consumerConsumer<? super String> consumer = System.out::println;//Attaching producer to consumerobservable.subscribe(consumer);}
}

上面示例中, “how”, “to”, “do”, “in”, “java” 可视为事件流。为这些事件创建观察者,然后创建消费者处理这些单词——为了简单起见,仅打印至控制台。消费者就是订阅者。

最后,我们使用subscribe()方法连接两者。一旦连接,单词(事件)流开始流动,订阅者开始在控制台打印输出。

内部源码显示,当新的单词从被观察者发出,每个订阅者会调用onNext()方法。当被观察者成功所有单词,订阅者调用onComplete()方法,错误发生时对调用onError()方法。

RxJava 2.0 依赖

项目中可以使用maven、gradle或增加jar包至类路径。

maven依赖

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

gradle依赖

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

jar依赖

下载RxJava 2.0 jar文件链接。

RxJava转换

在RxJava中,订阅者接受来自被观察者的事件类型和被观察者发出的事件类型可以不同。两者包括的数据、数据类型等都可以不同。

这就需要在源和目标之间的事件提供中间转换,这样两者之间工作机制可以兼容,很像适配器模式。

下面举例说明。在上面hello world示例中,如果需要打印单词的大写形式。这是最简单的转换,但容易理解。

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方法,然后才到订阅者进一步处理。这就是转换。

如前所述,我们也可以在转换过程中改变事件的数据类型:

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

这个示例,我们迭代每个单词,然后在转换中获得hashcode并传递给订阅者,最后在控制台中打印输出。这样被观察者发出字符串类型,订阅者接收integer类型。

总结

这种方式使被观察者和订阅者之间保持松耦合,给开发者带来极大优势。无需考虑对大多数人来说很难实现的并发模式,仅需要连接生产者和订阅者。一切都运转正常————完美无瑕。

另外,你也不需要考虑同时考虑生产者和订阅者。他们可以采用最佳的方式独立开发,然后使用转换连接它们。非常棒!

本文仅是RxJava的入门教程。后续陆续推出更多其重要概念。

RxJava 2.0 入门教程相关推荐

  1. 这可能是最好的RxJava 2.x 入门教程(二)

    这可能是最好的 RxJava 2.x 入门教程系列专栏 文章链接: 这可能是最好的 RxJava 2.x 入门教程(完结版)[推荐直接看这个] 这可能是最好的RxJava 2.x 入门教程(一) 这可 ...

  2. RxJava 2.x入门教程

    前言 首先来说一下rxjava1和rxjava2的区别吧,附带一些RxJava 1升级到RxJava 2过程中踩过的一些"坑",RxJava 对大家而言肯定不陌生,其受欢迎程度不言 ...

  3. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  4. pip更新失败_最全Tensorflow2.0 入门教程持续更新

    最全Tensorflow 2.0 入门教程持续更新: Doit:最全Tensorflow 2.0 入门教程持续更新​zhuanlan.zhihu.com 完整tensorflow2.0教程代码请看ht ...

  5. creo如何更改打开时显示方式_Creo4.0入门教程(3):设置工作目录和打开以及保存文件...

    原标题:Creo4.0入门教程(3):设置工作目录和打开以及保存文件 目标: 1.设置工作目录 2.文件的打开和保存 1.设置工作目录 工作目录是打开和保存文件的指定位置.通常默认工作目录为启动 Cr ...

  6. 【知识整理】这可能是最好的RxJava 2.x 入门教程(四)

    这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(完结版)[强力推荐] 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的R ...

  7. c语言编程:vc++6.0入门教程及习题_百度文库,C语言编程:vc++6.0入门教程及习题.doc...

    C语言编程:vc++6.0入门教程及习题.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址 ...

  8. matlab 7.1教程pdf,MATLAB7[1].0入门教程.ppt

    <MATLAB7[1].0入门教程.ppt>由会员分享,可在线阅读,更多相关<MATLAB7[1].0入门教程.ppt(34页珍藏版)>请在人人文库网上搜索. 1.1/33,2 ...

  9. Web 3.0入门教程

    Web 3.0入门教程 课程英文名:What Is Web3? 此视频教程共5.5小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址 百度网盘地址:​​​​​​​https://pan.baid ...

最新文章

  1. 管道、重定向、vim文本编辑器
  2. 基于python物流管理系统毕业设计-Python程序设计实验报告二
  3. redis RedisTemplate实现分布式锁
  4. c++ 继承机制易犯的错误
  5. C#中oracle数据库的连接方法
  6. 好用的工具网站!(缓慢收集中!)
  7. 工具的使用——vs2013(二)
  8. python3视频教学_Python3入门基础视频课程(下)
  9. 数据字典的一个简单案例
  10. 微型计算机的一般结构,微型计算机的基本结构
  11. 百度笔试题——页面调度算法
  12. Spring Security | 轻松搞定认证授权~
  13. 中关村连夜征集138项黑科技加入肺炎阻击战
  14. Multi-Gigabit MediaConverter车载以太网-万兆转换器
  15. 高级查询组件下拉框联动(三)
  16. 计算机研究生搞理论出来找工作,一个计算机专业研究生的迷茫
  17. win10 git bash 设置别名
  18. 为Linux发行版安装中文字体
  19. 2017年六级翻译:宋朝和唐朝
  20. Linux学习-40-格式化分区mkfs、mke2fs命令用法

热门文章

  1. 如何快速的获取微博内容?
  2. SW toolbox国标生成斜齿轮失败
  3. Java网络编程:socket与Netty
  4. Program Files (x86)\sogoupinyin\Components\程序异常结束
  5. windows安装torch_sparse\torch_geometric\torch_cluster
  6. 2014-12-28 iframe,style,body style
  7. MATLAB入门教程(2):调用内置函数
  8. 2019年美赛建模D题后续(2)
  9. 【日常计算机问题记录】装系统时烧录的u盘如何恢复正常
  10. 盛大的娱乐帝国路线图