ReactiveX 学习笔记(4)过滤数据流
Filtering Observables
本文主题为过滤 Observable 的操作符。
这里的 Observable 实质上是可观察的数据流。
Debounce / Throttle
ReactiveX - Debounce operator
Reactive Extensions再入門 その28「落ち着いたら流すThrottleメソッド」
Debounce / Throttle 只发送源数据流中满足如下条件的数据:源数据流在发送该数据之后在指定时间段内未发送任何数据。

- RxNET
var source = new Subject<int>();
source
.Throttle(TimeSpan.FromMilliseconds(500))
.Subscribe(i =>
Console.WriteLine("{0:HH:mm:ss.fff} {1}", DateTime.Now, i));
foreach (var i in Enumerable.Range(1, 10))
{
Console.WriteLine("{0:HH:mm:ss.fff} OnNext({1})",DateTime.Now, i);
source.OnNext(i);
Thread.Sleep(100);
}
Console.WriteLine("{0:HH:mm:ss.fff} Sleep(2000)", DateTime.Now);
Thread.Sleep(2000);
foreach (var i in Enumerable.Range(1, 5))
{
Console.WriteLine("{0:HH:mm:ss.fff} OnNext({1})", DateTime.Now, i);
source.OnNext(i);
Thread.Sleep(100);
}
Console.WriteLine("{0:HH:mm:ss.FFF} Sleep(2000)", DateTime.Now);
Thread.Sleep(2000);
/*
21:15:39.602 OnNext(1)
21:15:39.759 OnNext(2)
21:15:39.864 OnNext(3)
21:15:39.969 OnNext(4)
21:15:40.074 OnNext(5)
21:15:40.178 OnNext(6)
21:15:40.282 OnNext(7)
21:15:40.387 OnNext(8)
21:15:40.491 OnNext(9)
21:15:40.596 OnNext(10)
21:15:40.700 Sleep(2000)
21:15:41.105 10
21:15:42.706 OnNext(1)
21:15:42.809 OnNext(2)
21:15:42.911 OnNext(3)
21:15:43.011 OnNext(4)
21:15:43.113 OnNext(5)
21:15:43.217 Sleep(2000)
21:15:43.613 5
*/
- RxJava




Observable.concat(
Observable.interval(100, TimeUnit.MILLISECONDS).take(3),
Observable.interval(500, TimeUnit.MILLISECONDS).take(3),
Observable.interval(100, TimeUnit.MILLISECONDS).take(3))
.scan(0) { acc, v -> acc + 1 }
.debounce(150, TimeUnit.MILLISECONDS)
.dump()
/*
onNext: 3
onNext: 4
onNext: 5
onNext: 9
onComplete
*/
Observable.concat(
Observable.interval(100, TimeUnit.MILLISECONDS).take(3),
Observable.interval(500, TimeUnit.MILLISECONDS).take(3),
Observable.interval(100, TimeUnit.MILLISECONDS).take(3))
.scan(0) { acc, v -> acc + 1 }
.debounce { i -> Observable.timer(i * 50L, TimeUnit.MILLISECONDS) }
.dump()
/*
onNext: 0
onNext: 1
onNext: 3
onNext: 4
onNext: 5
onNext: 9
onComplete
*/
Observable.concat(
Observable.interval(100, TimeUnit.MILLISECONDS).take(3),
Observable.interval(500, TimeUnit.MILLISECONDS).take(3),
Observable.interval(100, TimeUnit.MILLISECONDS).take(3))
.scan(0) { acc, v -> acc + 1 }
.throttleWithTimeout(150, TimeUnit.MILLISECONDS)
.dump()
/*
onNext: 3
onNext: 4
onNext: 5
onNext: 9
onComplete
*/
Observable.interval(150, TimeUnit.MILLISECONDS)
.throttleFirst(1, TimeUnit.SECONDS)
.take(3)
.dump()
/*
onNext: 0
onNext: 7
onNext: 14
onComplete
*/
Observable.interval(150, TimeUnit.MILLISECONDS)
.throttleLast(1, TimeUnit.SECONDS)
.take(3)
.dump()
/*
onNext: 5
onNext: 12
onNext: 18
onComplete
*/
Distinct / DistinctUntilChanged
ReactiveX - Distinct operator
Reactive Extensions再入門 その23「重複を排除するメソッド」
Distinct 忽略源数据流的重复数据,只发送源数据流中其余各项。
DistinctUntilChanged 忽略源数据流中邻近的重复数据,只发送源数据流中其余各项。


- RxNET
var subject = new Subject<int>();
var distinct = subject.Distinct();
subject.Subscribe(
i => Console.WriteLine("{0}", i),
() => Console.WriteLine("subject.OnCompleted()"));
distinct.Subscribe(
i => Console.WriteLine("distinct.OnNext({0})", i),
() => Console.WriteLine("distinct.OnCompleted()"));
subject.OnNext(1);
subject.OnNext(2);
subject.OnNext(3);
subject.OnNext(1);
subject.OnNext(1);
subject.OnNext(4);
subject.OnCompleted();
/*
1
distinct.OnNext(1)
2
distinct.OnNext(2)
3
distinct.OnNext(3)
1
1
4
distinct.OnNext(4)
subject.OnCompleted()
distinct.OnCompleted()
*/
var subject = new Subject<int>();
var distinct = subject.DistinctUntilChanged();
subject.Subscribe(
i => Console.WriteLine("{0}", i),
() => Console.WriteLine("subject.OnCompleted()"));
distinct.Subscribe(
i => Console.WriteLine("distinct.OnNext({0})", i),
() => Console.WriteLine("distinct.OnCompleted()"));
subject.OnNext(1);
subject.OnNext(2);
subject.OnNext(3);
subject.OnNext(1);
subject.OnNext(1);
subject.OnNext(4);
subject.OnCompleted();
/*
1
distinct.OnNext(1)
2
distinct.OnNext(2)
3
distinct.OnNext(3)
1
distinct.OnNext(1)
1
4
distinct.OnNext(4)
subject.OnCompleted()
distinct.OnCompleted()
*/
- RxJava


val values = Observable.create<Int> { o ->
o.onNext(1)
o.onNext(1)
o.onNext(2)
o.onNext(3)
o.onNext(2)
o.onComplete()
}
values
.distinct()
.dump()
/*
onNext: 1
onNext: 2
onNext: 3
onComplete
*/
val values = Observable.create<String> { o ->
o.onNext("First")
o.onNext("Second")
o.onNext("Third")
o.onNext("Fourth")
o.onNext("Fifth")
o.onComplete()
}
values
.distinct { v -> v[0] }
.dump()
/*
onNext: First
onNext: Second
onNext: Third
onComplete
*/
val values = Observable.create<Int> { o ->
o.onNext(1)
o.onNext(1)
o.onNext(2)
o.onNext(3)
o.onNext(2)
o.onComplete()
}
values
.distinctUntilChanged()
.dump()
/*
onNext: 1
onNext: 2
onNext: 3
onNext: 2
onComplete
*/
val values = Observable.create<String> { o ->
o.onNext("First")
o.onNext("Second")
o.onNext("Third")
o.onNext("Fourth")
o.onNext("Fifth")
o.onComplete()
}
values
.distinctUntilChanged { v -> v[0] }
.dump()
/*
onNext: First
onNext: Second
onNext: Third
onNext: Fourth
onComplete
*/
- RxSwift
let disposeBag = DisposeBag()
Observable.of("
ReactiveX 学习笔记(4)过滤数据流的更多相关文章
- ReactiveX 学习笔记(0)学习资源
ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...
- ReactiveX 学习笔记(10)可连接的数据流
Connectable Observable Operators 本文的主题为处理 Connectable Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. R ...
- ReactiveX 学习笔记(5)合并数据流
Combining Observables 本文的主题为合并 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(四)Combining An ...
- ReactiveX 学习笔记(3)转换数据流
Transforming Observables 本文的主题为转换 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(二)Transform ...
- ReactiveX 学习笔记(2)创建数据流
操作符(Operators) Rx 的操作符能够操作(创建/转换/组合) Observable. Creating Observables 本文主题为创建/生成 Observable 的操作符. 这里 ...
- ReactiveX 学习笔记(12)调度器
Schedulers, threading and testing 本文的主题为调度器,多线程以及测试. RxJava操作符(六)Utility SubscribeOn / ObserveOn Sub ...
- ReactiveX 学习笔记(9)工具类操作符
Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...
- ReactiveX 学习笔记(8)错误处理和 To 操作符
Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...
- ReactiveX 学习笔记(7)聚合操作符
Mathematical and Aggregate Operators 本文的主题为处理 Observable 的聚合操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...
随机推荐
- [UE4]键盘鼠标输入事件
然后在角色的事件视图就可以使用预先定义好的事件
- [UE4]AnimOffset偏移动画
在每个在偏移动画要用到的动画文件中设置中设置上图属性. 也可以选择多个动画文件:
- linux 高级路由
1. 什么是高级路由? 是把信息从源穿过网络到达目的地的行为. 有两个动作:确定最佳路径,传输信息 确定最佳路径:手工指定,自动学习. 传输信息:隧道传输,流量整形 高级路由(策略路由)是根据一定的需 ...
- ORACLE 通过连接查询更新 update select
注意: 关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数. 所以,执行前需要测试, 普通办法就是: 先查看需要更新的 ...
- Spring MVC 处理JSON | JSONP类型数据
SpringMVC返回JSON格式的数据: 1 添加jar包(gson-2.8.0.jar): <dependency> <groupId>com.google.code.gs ...
- matlab 画图参考小程序
x=0.1:0.1:0.9; a=[41.37,44.34,44.34,44.66,44.66,44.66,98.85,98.85,98.85];%xxxxxx b=[22.10,22.39,22.3 ...
- android开发 RecyclerView 瀑布列表布局
1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...
- ORACLE ROWNUM解析[转]
一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>.>=.=.between...and”运算符,只能用如下运算符号“<.< ...
- 3.linux基本操作命令
2018年2月20日星期二 Linux常见操作命令 Linux 操作命令? ●查看进程是否启用? ps -aux|less ●查看磁盘剩余空间? cat /proc/meminfo 校验内存使用 ●s ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...