ReactiveX 学习笔记(3)转换数据流
Transforming Observables
本文的主题为转换 Observable 的操作符。
这里的 Observable 实质上是可观察的数据流。
RxJava操作符(二)Transforming Observables
公共代码
- 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));
}
- RxJava
fun <T> Observable<T>.dump() =
this.subscribe({ println("onNext: $it") },
{ println("onError: $it: ${it.message}") },
{ println("onComplete") })
fun <T> Observable<T>.dump(name: String) =
this.subscribe({ println("$name: onNext: $it") },
{ println("$name: onError: $it: ${it.message}") },
{ println("$name: onComplete") })
Buffer
ReactiveX - Buffer operator
Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
Buffer 转换数据流:间隔性地将数据流中邻近的数据打包,形成数据包的数据流。
这里的数据包即静态的数组。
- RxNET
var source = Observable.Interval(TimeSpan.FromSeconds(1)).Take(10);
source.Buffer(3, 1)
.Subscribe(
buffer =>
{
Console.WriteLine("--Buffered values");
foreach (var value in buffer)
Console.WriteLine(value);
}, () => Console.WriteLine("Completed"));
/*
--Buffered values
0
1
2
--Buffered values
1
2
3
..
--Buffered values
7
8
9
--Buffered values
8
9
--Buffered values
9
Completed
*/
- RxJava
Observable.range(0, 10)
.buffer(4)
.dump()
/*
onNext: [0, 1, 2, 3]
onNext: [4, 5, 6, 7]
onNext: [8, 9]
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS).take(10)
.buffer(250, TimeUnit.MILLISECONDS)
.dump()
/*
onNext: [0, 1]
onNext: [2, 3, 4]
onNext: [5, 6]
onNext: [7, 8, 9]
onNext: []
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS)
.take(10)
.buffer(250, TimeUnit.MILLISECONDS, 2)
.dump()
/*
onNext: [0, 1]
onNext: []
onNext: [2, 3]
onNext: []
onNext: [4, 5]
onNext: [6]
onNext: [7, 8]
onNext: [9]
onNext: []
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS).take(10)
.buffer(Observable.interval(250, TimeUnit.MILLISECONDS))
.dump()
/*
onNext: [0, 1]
onNext: [2, 3]
onNext: [4, 5, 6]
onNext: [7, 8, 9]
onNext: []
onComplete
*/
Observable.range(0, 10)
.buffer(4, 3)
.dump()
/*
onNext: [0, 1, 2, 3]
onNext: [3, 4, 5, 6]
onNext: [6, 7, 8, 9]
onNext: [9]
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS).take(10)
.buffer(350, 200, TimeUnit.MILLISECONDS)
.dump()
/*
onNext: [0, 1, 2]
onNext: [2, 3, 4]
onNext: [3, 4, 5, 6]
onNext: [6, 7, 8]
onNext: [7, 8, 9]
onNext: []
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS).take(10)
.buffer<Long, Long>(
Observable.interval(250, TimeUnit.MILLISECONDS),
Function { i -> Observable.timer(200, TimeUnit.MILLISECONDS) } )
.dump()
/*
onNext: [2, 3]
onNext: [5, 6]
onNext: [7, 8]
onNext: []
onComplete
*/
FlatMap / SelectMany
ReactiveX - FlatMap operator
Reactive Extensions再入門 その40「IObservableの合成はじめました」
FlatMap / SelectMany 转换数据流:将源数据流的每一项都转换成数据流,从而形成数据流的数据流,最后再平坦化将两维数据流合并成一个数据流。
- 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
*/
- RxJava
val values = Observable.just(2)
values
.flatMap { i -> Observable.range(0, i) }
.dump()
/*
onNext: 0
onNext: 1
onComplete
*/
val values = Observable.range(1, 3)
values
.flatMap { i -> Observable.range(0, i) }
.dump()
/*
onNext: 0
onNext: 0
onNext: 1
onNext: 0
onNext: 1
onNext: 2
onComplete
*/
val values = Observable.just(1)
values
.flatMap { i ->
Observable.just(
Character.valueOf((i + 64).toChar())
)
}
.dump()
/*
onNext: A
onComplete
*/
val values = Observable.range(0, 30)
values
.flatMap<Char> { i ->
if (i in 1..26)
Observable.just(Character.valueOf((i + 64).toChar()))
else
Observable.empty()
}
.dump()
/*
onNext: A
onNext: B
...
onNext: Y
onNext: Z
onComplete
*/
Observable.just(100, 150)
.flatMap { i ->
Observable.interval(i.toLong(), TimeUnit.MILLISECONDS)
.map { v -> i }
}
.take(10)
.dump()
/*
onNext: 100
onNext: 150
onNext: 100
onNext: 150
onNext: 100
onNext: 100
onNext: 150
onNext: 100
onNext: 100
onNext: 150
onComplete
*/
Observable.just(100, 150)
.concatMap { i ->
Observable.interval(i.toLong(), TimeUnit.MILLISECONDS)
.map { v -> i }
.take(3)
}
.dump()
/*
onNext: 100
onNext: 100
onNext: 100
onNext: 150
onNext: 150
onNext: 150
onComplete
*/
Observable.interval(100, TimeUnit.MILLISECONDS)
.switchMap { i ->
Observable.interval(30, TimeUnit.MILLISECONDS)
.map { l -> i }
}
.take(9)
.dump()
/*
onNext: 0
onNext: 0
onNext: 0
onNext: 1
onNext: 1
onNext: 1
onNext: 2
onNext: 2
onNext: 2
onComplete
*/
concatMap / flatMap / switchMap
flatMapIterable
Observable.range(1, 3)
.flatMapIterable { i -> 1..i }
.dump()
/*
onNext: 1
onNext: 1
onNext: 2
onNext: 1
onNext: 2
onNext: 3
onComplete
*/
Observable.range(1, 3)
.flatMapIterable<Int, Int>(
{ i -> 1..i },
{ ori, rv -> ori * rv })
.dump()
/*
onNext: 1
onNext: 2
onNext: 4
onNext: 3
onNext: 6
onNext: 9
onComplete
*/
Observable.range(1, 3)
.flatMapIterable<Int, Int>(
{ i -> generateSequence(1) { (it + 1).takeIf { it <= i } }.asIterable() },
{ ori, rv -> ori * rv })
.dump()
/*
onNext: 1
onNext: 2
onNext: 4
onNext: 3
onNext: 6
onNext: 9
onComplete
*/
- RxSwift
let disposeBag = DisposeBag()
struct Player {
var score: Variable<Int>
}
let
ReactiveX 学习笔记(3)转换数据流的更多相关文章
- ReactiveX 学习笔记(0)学习资源
ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...
- ReactiveX 学习笔记(30)操作符辨析
RxJava: merge/concat/switch RxJS: merge/concat/switch/exhaust RxSwift: merge/concat/switchLatest mer ...
- ReactiveX 学习笔记(2)创建数据流
操作符(Operators) Rx 的操作符能够操作(创建/转换/组合) Observable. Creating Observables 本文主题为创建/生成 Observable 的操作符. 这里 ...
- ReactiveX 学习笔记(10)可连接的数据流
Connectable Observable Operators 本文的主题为处理 Connectable Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. R ...
- ReactiveX 学习笔记(5)合并数据流
Combining Observables 本文的主题为合并 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(四)Combining An ...
- ReactiveX 学习笔记(4)过滤数据流
Filtering Observables 本文主题为过滤 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(三)Filtering Deb ...
- ReactiveX 学习笔记(8)错误处理和 To 操作符
Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...
- ReactiveX 学习笔记(12)调度器
Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...
- ReactiveX 学习笔记(9)工具类操作符
Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...
随机推荐
- [UE4]UniformGirdPanel
- HBase常用操作命令
HBase常用操作命令 1.进入HBase脚本客户端 #hbase shell #进入HBase脚本客户端 > whoami #查看当前登录用户 > status ...
- ZooKeeper系列(10):ZooKeeper与Dubbo的结合
1. Dubbo的快速讲解 以防有人对Dubbo不了解,快速过一下Dubbo的基本概念,下面简单引用一下官方的介绍 1.1 架构 1.2.角色说明 Provider:暴露服务的提供方 Consumer ...
- C++ 调用 Lua
直接上代码: 1:c++代码 #include <lua.hpp> #include <LuaBridge/LuaBridge.h> #include <iostream ...
- vue使用树形控件z-tree,动态添加数据,默认展开第一行
环境:vue 2.9.3; webpack; 插件:z-tree,jquery(cnpm install xxxx) 问题;由于数据量比较多,需要动态加载数据,默认第一次请求的数据是最高一级,然后子集 ...
- solr 请求参数过长报错,Solr配置maxBooleanClauses属性不生效原因分析
博客分类: 上次已经写过一篇关于solr中,查询条件过多的异常的文章,这次在总结扩展一下: 有时候我们的查询条件会非常多,由于solr的booleanquery默认设置的条件数为1024,所以超过 ...
- MySQL库操作,表操作,数据操作。
数据库服务器:本质就是一台计算机,该计算机上安装有数据库管理软件的服务端,供客户端访问使用. 1数据库管理系统RDBMS(本质就是一个C/S架构的套接字),关系型数据库管理系统. 库:(文件夹)- ...
- vue的v-for数组和对象
v-for="(item,index) of hot" //数组遍历 v-for="(item,key,index) of cities" //对象遍历 //k ...
- C# .NET ToList()分页
ViewData.Model = Limodel.ToList().Skip((page - ) * ).Take().ToList(); //page 当前页,10:每页几条数据
- 【Eclipse】如何在Eclipse中如何自动添加注释和自定义注释风格
背景简介 丰富的注释和良好的代码规范,对于代码的阅读性和可维护性起着至关重要的作用.几乎每个公司对这的要求还是比较严格的,往往会形成自己的一套编码规范.但是再实施过程中,如果全靠手动完成,不仅效率低下 ...