Rx 学习笔记(3)转换

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

猜你喜欢

转载自www.cnblogs.com/zwvista/p/9333314.html
今日推荐