- 原文出自《RxJava Essentials》
- 原文做者 : Ivan Morgillo
- 译文出自 : 开发技术前线 www.devtf.cn
- 转载声明: 本译文已受权开发人员头条享有独家转载权,未经赞成,不得转载!
- 译者 : yuxingxin
- 项目地址 : RxJava-Essentials-CN
响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观測,被过滤,被操做。或者为新的消费者与另一条流合并为一条新的流。java
响应式编程的一个关键概念是事件。事件可以被等待。可以触发过程。也可以触发其它事件。事件是惟一的以合适的方式将咱们的现实世界映射到咱们的软件中:假设屋里太热了咱们就打开一扇窗户。相同的。当咱们更改电子表(变化的传播)中的一些数值时,咱们需要更新整个表格或者咱们的机器人碰到墙时会转弯(响应事件)。git
今天,响应式编程最通用的一个场景是UI:咱们的移动App必须作出对网络调用、用户触摸输入和系统弹框的响应。在这个世界上,软件之因此是事件驱动并响应的是因为现实生活也是如此。github
函数响应式编程是一个来自90年代后期受微软的一名计算机科学家Erik Meijer启示的思想。用来设计和开发微软的Rx库。数据库
Rx 是微软.NET的一个响应式扩展。编程
Rx借助可观測的序列提供一种简单的方式来建立异步的,基于事件驱动的程序。开发人员可以使用Observables模拟异步数据流,使用LINQ语法查询Observables。并且很是easy管理调度器的并发。markdown
Rx让众所周知的概念变得易于实现和消费,好比push方法。在响应式的世界里。咱们不能伪装做用户不关注或者是不抱怨它而一味的等待函数的返回结果,网络调用,或者数据库查询的返回结果。网络
咱们时刻都在等待某些东西,这就让咱们失去了并行处理其它事情的机会,提供更好的用户体验,让咱们的软件免受顺序链的影响,而堵塞编程。架构
下表列出的与.NET 枚举相关的.NET Observable并发
.NET Observable | 一个返回值 | 多个返回值 |
---|---|---|
Pull/Synchronous/Interactive | T |
IEnumerable<T> |
Push/Asynchronous/Reactive | Task<T> |
IObservable<T> |
push方法把这个问题逆转了:取而代之的是再也不等待结果,开发人员仅仅是简单的请求结果,而当它返回时获得一个通知就能够。开发人员对即将发生的事件提供一个清晰的响应链。对于每一个事件,开发人员都做出对应的响应;好比。用户被要求登陆的时候,提交一个携带他的username和password的表单。应用程序运行登陆的网络请求,接下来将要发生的状况有:异步
正如你用push方法所示。开发人员不需要等待结果。而是在结果返回时通知他。在这期间,他可以作他想作的不论什么事情:
Netflix在2012年開始意识到他们的架构要知足他们庞大的用户群体已经变得寸步难行。所以他们决定又一次设计架构来下降REST调用的次数。
代替几十次的REST调用。而是让client本身处理需要的数据。他们决定基于client需求建立一个专门优化过的REST调用。
为了实现这一目标。他们决定尝试响应式,開始将.NET Rx迁移到JVM上面。他们不想仅仅基于Java语言。而是整个JVM。从而有可能为市场上的每一种基于JVM的语言:如Java、Closure、Groovy、Scala等等提供一种新的工具。
2013年二月份,Ben Christensen 和 Jafar Husain发在Netflix技术博客的一篇文章第一次向世界展现了RxJava。
主要特色有:
正如.NET,RxJava Observable 是push 迭代的等价体。即pull。pull方法是堵塞并等待的方法:消费者从源头pull值。并堵塞线程直到生产者提供新的值。
push方法做用于订阅和响应:消费者订阅新值的发射,当它们可用时生产者push这些新值并通知消费者。在这一点上,消费者消费了它们。push方法很是明显更灵活。因为从逻辑和实践的观点来看,开发人员仅仅需忽略他需要的数据是来自同步仍是异步;他的代码将仍然起做用。
从纯Java的观点看,RxJava Observable类源自于经典的Gang Of Four的观察者模式。
它加入了三个缺乏的功能:
Observables和Iterables共用一个相似的API:咱们在Iterable可以运行的不少操做也都相同可以在Observables上运行。固然,因为Observables流的本质。没有如Iterable.remove()这样对应的方法。
Pattern | 一个返回值 | 多个返回值 |
---|---|---|
Synchronous | T getData() |
Iterable<T> |
Asynchronous | Future<T> getData() |
Observable<T> getData() |
从语义的角度来看。RxJava就是.NET Rx。从语法的角度来看,Netflix考虑到了对应每一个Rx方法,保留了Java代码规范和主要的模式。
本章中,咱们初步探索了响应式的世界。从微软的.NET到Netflix的RxJava。咱们了解了Rx是怎样诞生的,咱们也了解到传统的方法与响应式方法相比之间的相似和不一样。
下一章。咱们将学习到Observables是什么,以及怎样建立它并把响应式编程应用到咱们的平常编码中去。