Nested observables
队列的队列这个概念结合例子会比较容易理解:
- 数据的分组:你可以把源队列的数据进行分组,使它可以轻松的过滤和共享到其他源。分组数据也可以用于进行聚合,常用的做法是GroupBy操作。
- 在线游戏服务器:可以这样来构思一个服务器的队列——新value代表服务器在线。value本身是一个可以让订阅者看到可用服务器实时信息(数量和质量)的队列的延迟值,当服务器下线时内部队列也会完成。
- 金融数据流:新的市场或工具可能日夜颠倒。可以把价格处理为流并在市场关闭后完成。
- 聊天室:用户可以加入聊天(外部队列),发送消息(内部队列)和终止聊天(完成内部队列)。
- 文件查看器:文件被添加到一个目录,它们可以观看修改(外部队列),内部队列可以表示文件的修改,内部队列的完成可以表示删除文件。
当使用嵌套的可观测物时,采用一个新的队列来表示一个新建的事物是很方便的,比如新游戏服务器上线,一个市场开始营业,用户加入聊天,创建一个文件等。然后你可以对一个完整的内部队列(如服务器下线、市场关闭、用户终止聊天等)采用一套规则。嵌套可观测物方便之处在于可以通过一个新的内部队列来重启一个完整的内部队列。
Transformation of sequences
本章我们将介绍队列的Transformation操作,该类型方法接受一个队列并在每一个元素上应用一些转换,以产生一个新的队列。预览:
Ana(morphism) enters the sequence: T --> IObservable<T>
Ana进入队列
Cata(morphism) leaves the sequence: IObservable<T> --> T
Cata离开队列
Bind modifies the sequence: IObservable<T1> --> IObservable<T2>
Bind修改队列
Select
Select允许你提供一个接受一个TSource值并返回一个TResult的方法(Func类型委托),并将TResult类型的结果储存到一个新队列中返回。它的签名很简单,表明它最经常的用法是从IObservable<TSource>类型转换到IObservable<TResult>类型。
注意,并没有防止TSource和TResult相同的限制,所以第一个例子我们接受一个int队列并通过为每个值加3进行转换(Transformation),结果储存在另外一个int队列(为每个值加3并储存到另一个队列的行为就叫做Transformation):
Output:
+3-->3
+3-->4
+3-->5
+3-->6
+3-->7
+3 completed
更常用的场景是将一种类型转换为另一种类型,这也更符合Transformation的概念。下面的例子将把int转换为string:
Output:
char-->A
char-->B
char-->C
char-->D
char-->E
char completed
如果想要配合LINQ可以把int队列转换为匿名类型队列:
Output:
anon-->{ Number = 1, Character = A }
anon-->{ Number = 2, Character = B }
anon-->{ Number = 3, Character = C }
anon-->{ Number = 4, Character = D }
anon-->{ Number = 5, Character = E }
anon completed
还有一个重载向selector方法(Func类型委托)提供两个值。附加参数是队列中元素的index。如果队列中元素的index对selector方法重要则使用此重载。
Cast and OfType
Cast<T>方法将一个队列,比如说IObservable<object>中的每个元素转换为指定类型,如果元素不能被转换则会抛出错误
Output:
cast-->1
cast-->2
cast-->3
cast completed
下面的例子模拟了不能被转换时的情况:
Output:
cast-->1
cast-->2
cast failed -->Specified cast is not valid.
我们从输出中看到,string类型的“3”无法被转换,从而导致了失败。
如果不想出现错误,我们可以使用OfType<T>(),它将忽略无法被转换的元素:
Output:
OfType-->1
OfType-->2
OfType-->4
OfType completed
以下这些写法的效果是相同的:
Timestamp and TimeInterval
可观测物队列是异步的,它可以很方便的知道什么时候接收了元素。Timestamp方法可以方便的将队列中的元素包裹在一个轻量级的Timestamped<T>中。Timestamped<T>类型是一个暴露自身包含的元素值并根据创建时间为这些元素打上时间戳的结构体。
下面的例子中创建了一个有三个值的队列,每隔1秒,将其转换为一个时间戳队列。对Timestamped<T>使用ToString()方便的实现了可读的输出:
Output
TimeStamp-->0@01/01/2012 12:00:01 a.m. +00:00
TimeStamp-->1@01/01/2012 12:00:02 a.m. +00:00
TimeStamp-->2@01/01/2012 12:00:03 a.m. +00:00
TimeStamp completed
0、1、2之间的生成间隔为1秒。获取绝对时间戳的另一种方法是获取从上一个元素生成的时间和间隔时间。TimeInterval方法可以用于这种情况。TimeInterval方法的元素也被包裹在轻量级的结构中,但类型是TimeInterval<T>。
Output:
TimeInterval-->0@00:00:01.0180000
TimeInterval-->1@00:00:01.0010000
TimeInterval-->2@00:00:00.9980000
TimeInterval completed
从输出中可以看出间隔并不是正好1秒,但非常接近。
暂无关于此日志的评论。