DevilKing's blog

冷灯看剑,剑上几分功名?炉香无需计苍生,纵一穿烟逝,万丈云埋,孤阳还照古陵

0%

RxJava intro

原文链接

关于流式编程的一些说明,Stream API

1
2
3
4
5
6
7
8
// JavaScript
let r = [1,2,3,4,5,6,7,8,9].filter(i=>i>5).map(i=>i*10).reduce((a,b)=>a+b, 0)

// Ruby
r = [1,2,3,4,5,6,7,8,9].select {|i| i>5}.map {|i| i*10}.reduce(0) {|a,b| a+b}

// Swift
var r = [1,2,3,4,5,6,7,8,9].filter {$0>5}.map {$0*10}.reduce(0) {$0+$1}
1
2
3
4
5
6
Integer[] numbers = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
Observable.from(numbers)
.filter(integer) -> { return integer > 5; })
.map((integer) -> { return integer * 10; })
.reduce(0, (int1, int2) -> { return int1 + int2; })
.subscribe((integer) -> { Log.i(TAG, "result: " + integer); });
  1. 流式编程法,每一个单独的步骤,在内部都重新对整体数据进行一次循环,因此它要做很多次小循环,但整体的流程只走一遍。
  2. Rx,只在数据最源头,对整体数据进行一次循环,取出每一个单独的数据,让它去走一遍整体流程,因此,它只做一次循环,但整个的流程会走很多遍。

对于 Rx 来说,如果数据源不是固定的,那么它可以监听这个数据来源,当有数据到来时,它就可以把它发射出去把整个流程走一遍。这就是我用来理解 Rx 的观察者模式和响应式编程的方法。

Rx 比常见流式编程的抽象程度更高,它不光抽象了对数据的操作,还抽象了线程切换操作。

Rx的Promise和Observable对象:

  • Promise 对象,当它被 new 出来后,其中的方法体是立即执行的,不管后面有没有用 .then() 加上回调,执行的结果被存储在对象之中,如果后面再用 .then() 加上回调,之前的结果会马上传递给新的回调。
  • Rx 的 Observable 对象,当它被 new 出来后,其中的方法体,只有 .subscribe() 方法被执行的那一刻才会执行,否则,只要没有调用 .subscribe(),其中的变换就永远不会执行,这和 Promise 是完全不一样的。

只要是 T -> Observable 的变换,就应该用 flatMap