@Loong-T
2015-07-21T06:39:28.000000Z
字数 1946
阅读 1536
了解基础知识对理解有帮助,这部分偏理论。而且个人理解有限,整理可能有误,所以了解一下就够。
Reactive programming,响应式编程,是来自于函数式编程范式的一种编程模型。Functional reative programming(FRP)特别适合应用于异步或强交互 GUI 编程中。
按照 Martin Odersky(Scala 之父)的课程 Principles of Reactive Programming 所说,响应式编程有四个特点:
前三条是实现第四条的基础。
对应到 RxJava 上来:Observable 是从 event 构建的;使用操作符 Operator 可以对 Observable 进行非常灵活方便的扩展;onError() 会收集过程中产生的所有错误。
Rx 是基于观察者模式的,对异步编程有很好的支持,可以回避 callback hell 以及大量的 try catch 块。对应到同步编程上,是迭代器模式:
An Observable is the asynchronous/push “dual” to the synchronous/pull Iterable
event | Iterable (pull) | Observable (push) |
---|---|---|
retrieve data | T next() | onNext(T) |
discover error | throws Exception | onError(Exception) |
complete | !hasNext() | onCompleted() |
Iterable:
getDataFromLocalMemory()
.skip(10)
.take(5)
.map({ s -> return s + " transformed" })
.forEach({ println "next => " + it })
Observable:
getDataFromNetwork()
.skip(10)
.take(5)
.map({ s -> return s + " transformed" })
.subscribe({ println "onNext => " + it })
Monad 是函数式编程中非常重要的一种抽象数据结构。比较抽象,我也没理解完全,所以只能简单介绍下。下面的知识点大部分来自于 Principles of Reactive Programming。
Monad 是遵从一定的代数原则的数据结构,通常来说会有两个方法:flatMap 和 unit。
对于一个名为 M 的 monad,类型为 M<T>
,有:
public M<U> flatMap<U>(T -> M<U>);
public M<T> unit<T>(T);
Monad laws 是用于鉴定一个类型是否是 monad 的原则,并且也用于指导如何使用 monad。看看就好。
Monad Laws:
m flatMap f flatMap g == m flatMap (x => f(x) flatMap g)
。整数是一种 monad 的特例,称为 monoid,结合律就比较容易理解了。unit(x) flatMap f == f(x)
m flatMap unit == m
如果还定义了 withFilter 方法,monad 被称为 monad with zero。
在深入浅出RxJava(二:操作符)中提到,flatMap 是最难理解的部分。
通常来说 map 操作符更为常用,map 的类型签名:public M<U> map<U>(T -> U)
。(Map 是使用 flatMap 实现的 m.map(f) == m.flatMap(x -> unit(f(x)))
。)
对比 flatMap 签名 public M<U> flatMap<U>(T -> M<U>)
可知,两个方法的不同在于传入的方法参数不同。
两个方法返回的类型都是 Observable<T>
,但 map 传入的方法参数是 T -> U
,将 event 从 T 类型转换为 U 类型,然后返回的是包含了所有 U 类型 event 的 Observable。
flatMap 传入的方法参数是 T -> Observable<U>
,将每一个 T 类型的 event 都分别包装成 Observable 返回。
简而言之,对一个 Observable 进行 map 返回的是一个 Observable,而对一个 Observable 进行 flatMap 可以返回多个 Observable。
游戏编程的未来——FRP(函数式反应型编程):这种编程范式面向和关注数据流和变化的扩散,它可以方便的建立动态的数据流,其底层机制会让数据流的变化自动扩散到相应的逻辑。