限制操作符
其实就是对Observable 进行限制,
Filter
看字面意思就是过滤, 根据所给的对象,满足相应的要求返回ture ,这个值就会继续传播,如果false 则停止传播,就这么直接,就这么简单。
Observable.just("This is the most.", "This is test.", "Hhahhh").filter {
it.contains("This")
}.subscribe { println("$it") }
take
take 有两个重载,一个是进行相应的数字的发送,就执行onComplete 方法,并且停止其他所有的发送,
- 次数
Observable.just("This is the most.", "This is test.", "Hhahhh").take(2).subscribe { println("$it") }
- 时间
Observable.interval(100, TimeUnit.MILLISECONDS).take(2, TimeUnit.SECONDS).subscribe { println("This is test $it") }
Thread.sleep(5000)
skip
和take 正好相反,他将会忽略前面指定的发送次数,然后发送后面的item.
- 忽略次数
Observable.just("a", "b", "c").skip(1).subscribe {
println("this is test for $it")
}
- 忽略时间
Observable.interval(3, TimeUnit.SECONDS).skip(1, TimeUnit.SECONDS).subscribe {
println("The man is test for you! $it")
}
Thread.sleep(3000)
takeWhile &skipWhile
条件take,条件skip
Observable.range(0, 100).takeWhile { it < 10 }.subscribe { println("This num is $it") }
Observable.range(0, 100).skipWhile { it < 90 }.subscribe { println("This skip run $it") }
distinct
顾名思义就是不同,如果发送的元素中有两个一样的,那么只会发送其中一个 ,这就有点集合的味道,没有相同的元素。
看代码
Observable.just("A", "B", "BB", "AA", "CCC", "DDD").map { it.length }.distinct().subscribe { println("Num is $it") }
如果想直接判断长度,而发送源数据, 请看下列代码
Observable.just("A", "B", "BB", "AA", "CCC", "DDD").distinct { it.length }.subscribe { println("This letter is $it ") }
如果你运行,你将会看见直接打印出结果,这很nice!
distinctUntilChanged
distinct 是发送不同的元素,而distinctUtilChanged 是发送不同的于前一个次发送的元素,所以如果你想要发送对的和前面已经发送的元素是一样的,那他将不会发送,直到你发送的值改变为止。
Observable.just(1, 1, 2, 1, 2, 2, 1, 2, 3, 10)
.distinctUntilChanged().subscribe { println("num is $it") }
看看打印信息,你会非常开心
elementAt
就是发送指定索引的元素,就像数组一样,可以直接访问某个索引!
Observable.just("A", "B", "C").elementAt(1).subscribe { println("This element is $it") }