Transforming Observables
本文的主题为转换 Observable 的操作符。
这里的 Observable 实质上是可观察的数据流。
公共代码
- RxNET
public static void Dump<T>(this IObservable<T> source, string name)
{
source.Subscribe(
i => Console.WriteLine("{0}-->{1}", name, i),
ex => Console.WriteLine("{0} failed-->{1}", name, ex.Message),
() => Console.WriteLine("{0} completed", name));
}
Buffer
Buffer 转换数据流:间隔性地将数据打包,形成数据包的数据流。
- RxJava
Observable.range(1, 5)
.buffer(3)
.subscribe { println(it) }
/*
[1, 2, 3]
[4, 5]
*/
- RxNET
FlatMap
FlatMap 转换数据流:将源数据流的每一项都转换成数据流,从而形成数据流的数据流,最后再平坦化将两维数据流合并成一个数据流。
- RxJava
Observable.just(1, 2, 3)
.flatMap<Int> { i -> Observable.range(i, i * 2) }
.subscribe { print(it) }
// 122345345678
- RxNET
Observable.Range(1, 3)
.SelectMany(i => Observable.Range(1, i))
.Dump("SelectMany");
/*
SelectMany-->1
SelectMany-->1
SelectMany-->2
SelectMany-->1
SelectMany-->2
SelectMany-->3
SelectMany completed
*/
GroupBy
GroupBy 转换数据流:将数据分组,结果是被分组的数据流的数据流。
- RxJava
Observable.range(1, 10)
.groupBy<Int> { it % 3 }
.subscribe { g -> g.toList().subscribe { lst -> println(lst) } }
/*
[3, 6, 9]
[1, 4, 7, 10]
[2, 5, 8]
*/
- RxNET
Map
Map 转换数据流:针对源数据流的每一项都调用指定函数。
- RxJava
Observable.just(1, 2, 3)
.map<Int> { it * 10 }
.subscribe { println(it) }
/*
10
20
30
*/
- RxNET
var source = Observable.Range(0, 3);
source.Select(i => i + 3).Dump("+3");
source.Select(i => (char)(i + 64)).Dump("char");
source.Select(i => new { Number = i, Character = (char)(i + 64) }).Dump("anon");
var query = from i in source
select new { Number = i, Character = (char)(i + 64) };
query.Dump("anon");
/*
+3-->3
+3-->4
+3-->5
+3 completed
char-->@
char-->A
char-->B
char completed
anon-->{ Number = 0, Character = @ }
anon-->{ Number = 1, Character = A }
anon-->{ Number = 2, Character = B }
anon completed
anon-->{ Number = 0, Character = @ }
anon-->{ Number = 1, Character = A }
anon-->{ Number = 2, Character = B }
anon completed
*/
Scan
Scan 转换数据流:
- 该操作带有一个二元函数。
- 结果数据流的第 1 项等于源数据流的第 1 项。
- 结果数据流的第 n + 1 项等于把结果数据流的第 n 项和源数据流的第 n + 1 项作为参数传给二元函数进行计算后的结果。
...
- RxJava
Observable.range(1, 5)
.scan { sum, item -> sum + item }
.subscribe { println(it) }
/*
1
3
6
10
15
*/
- RxNET
Window
Window 转换数据流:间隔性地将数据分段,形成数据流的数据流,即两维数据流。
- RxJava
Observable.range(1, 5)
.window(3)
.subscribe { g -> g.toList().subscribe { lst -> println(lst) } }
/*
[1, 2, 3]
[4, 5]
*/
- RxNET