限制操作符

其实就是对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") }

results matching ""

    No results matching ""