java 事件流_RxJava 教程第二部分:事件流基础之 检查数据

Inspection 检查数据是否符合某一条件

前面一节介绍了如何过滤掉我们不关心的数据。有时候我们需要了解该数据流中的数据是否符合某一条件。本节来介绍一些检查数据流中数据的函数。

all

all 函数用来判断 observable 中发射的所有数据是否都满足一个条件。

Java

public final Observable all(Func1 super T,java.lang.Boolean> predicate)

1

2

publicfinalObservableall(Func1<?superT ,java.lang.Boolean>predicate)

Java

Observable values = Observable.create(o -> {

o.onNext(0);

o.onNext(10);

o.onNext(10);

o.onNext(2);

o.onCompleted();

});

Subscription evenNumbers = values

.all(i -> i % 2 == 0)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Observablevalues=Observable.create(o->{

o.onNext(0);

o.onNext(10);

o.onNext(10);

o.onNext(2);

o.onCompleted();

});

SubscriptionevenNumbers=values

.all(i->i%2==0)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

true

Completed

1

2

3

true

Completed

all 函数返回的是一个发射一个 布尔值的 Observable,而不是直接返回一个 布尔值。原因在于我们并不知道源 Observable 何时才结束数据流的发射,只有当源 Observable 发射结束的时候, all 函数才知道结果是否都满足条件。只要遇到一个不满足条件的数据,all 函数就立刻返回 false。 只有当源 Observable 结束发射并且所发射的所有数据都满足条件的时候才会产生 true。在 observable 内返回结果可以方便的实现非阻塞操作。 在下个示例中可以看到 all 在遇到不满足的数据的时候就立刻结束了。

Java

Observable values = Observable.interval(150, TimeUnit.MILLISECONDS).take(5);

Subscription subscription = values

.all(i -> i<3) // Will fail eventually

.subscribe(

v -> System.out.println("All: " + v),

e -> System.out.println("All: Error: " + e),

() -> System.out.println("All: Completed")

);

Subscription subscription2 = values

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Observablevalues=Observable.interval(150,TimeUnit.MILLISECONDS).take(5);

Subscriptionsubscription=values

.all(i->i<3)// Will fail eventually

.subscribe(

v->System.out.println("All: "+v),

e->System.out.println("All: Error: "+e),

()->System.out.println("All: Completed")

);

Subscriptionsubscription2=values

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

0

1

2

All: false

All: Completed

3

4

Completed

1

2

3

4

5

6

7

8

9

0

1

2

All:false

All:Completed

3

4

Completed

如果源 Observable 出现了错误,则 all 操作就没有意义了,all 会直接发射一个 error 然后结束。

Java

Observable values = Observable.create(o -> {

o.onNext(0);

o.onNext(2);

o.onError(new Exception());

});

Subscription subscription = values

.all(i -> i % 2 == 0)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Observablevalues=Observable.create(o->{

o.onNext(0);

o.onNext(2);

o.onError(newException());

});

Subscriptionsubscription=values

.all(i->i%2==0)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

Error: java.lang.Exception

1

2

Error:java.lang.Exception

如果源 Observable 在出错之前就发射了一个不满足条件的数据,则 源 Observable 的错误对 all 没有影响( all 遇到不满足条件的数据就结束了,结束的Observable 无法再继续发射数据了)。

Java

Observable values = Observable.create(o -> {

o.onNext(1);

o.onNext(2);

o.onError(new Exception());

});

Subscription subscription = values

.all(i -> i % 2 == 0)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Observablevalues=Observable.create(o->{

o.onNext(1);

o.onNext(2);

o.onError(newException());

});

Subscriptionsubscription=values

.all(i->i%2==0)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

false

Completed

1

2

3

false

Completed

exists

如果源 exists 发射的数据中有一个满足条件,则 exists 就返回 true。 exists 和 all 一样也是返回一个 Observable 而不是直接返回 布尔值。

98377c7992ac41486d48cab256d908aa.png

Java

Observable values = Observable.range(0, 2);

Subscription subscription = values

.exists(i -> i > 2)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.range(0,2);

Subscriptionsubscription=values

.exists(i->i>2)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

false

Completed

1

2

3

false

Completed

上面示例中只发射了 0 和1 两个数据,而这两个数据都不满足大于2的条件,所以返回结果为 false。

如果我们多发射几个数据,则就会满足条件了。

Java

Observable values = Observable.range(0, 4);

1

2

Observablevalues=Observable.range(0,4);

结果:

Java

true

Completed

1

2

3

true

Completed

isEmpty

顾名思义,判断一个 Observable 是否是空的,也就是没有发射任何数据就结束了。

c9e16dcbb0bc333362e29a41f091dbf2.png

Java

Observable values = Observable.timer(1000, TimeUnit.MILLISECONDS);

Subscription subscription = values

.isEmpty()

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.timer(1000,TimeUnit.MILLISECONDS);

Subscriptionsubscription=values

.isEmpty()

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

false

Completed

1

2

3

false

Completed

只要源 Observable 发射了一个数据,isEmpty 就立刻返回 false, 只有当源 Observable 完成了并且没有发射数据,isEmpty 才返回 true。

contains

contains 使用 Object.equals 函数来判断源 Observable 是否发射了相同的数据。

只要遇到相同的数据,则 contains 就立刻返回。

ef3e6abb751f1761f1d2dc6013101623.png

Java

Observable values = Observable.interval(100, TimeUnit.MILLISECONDS);

Subscription subscription = values

.contains(4L)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.interval(100,TimeUnit.MILLISECONDS);

Subscriptionsubscription=values

.contains(4L)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

true

Completed

1

2

3

true

Completed

注意上面使用的是 contains(4L), 而不是 contains(4), 由于 values 是 Observable类型的, 所以需要使用 Long 类型而不能是 Integer 类型。

如果使用 contains(4) 则什么都不会打印出来, 由于 values 是一个无限的数据流,所以 contains 一直在等待一个相同的数据发射出来,但是在 values 里面是没有一样的数据的,导致 contains 一直等待下去。

defaultIfEmpty

如果你不想单独处理没有发射任何数据的情况(需要用 isEmpty 函数来检查是否为空),则可以使用 defaultIfEmpty 函数来强制一个空的 Observable 发射一个默认数据。

514a741c0bcc44d0b0d35881a5bcd70e.png

Java

Observable values = Observable.empty();

Subscription subscription = values

.defaultIfEmpty(2)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.empty();

Subscriptionsubscription=values

.defaultIfEmpty(2)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

2

Completed

1

2

3

2

Completed

只有当 onCompleted 事件发生了,并且 Observable 没有发射任何数据的时候,才会使用默认值;否则不会使用默认值。 如果发生了错误,则还会有错误的结果。

Java

Observable values = Observable.error(new Exception());

Subscription subscription = values

.defaultIfEmpty(2)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.error(newException());

Subscriptionsubscription=values

.defaultIfEmpty(2)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

Error: java.lang.Exception

1

2

Error:java.lang.Exception

elementAt

从特定的位置选择一个数据发射。

789b3d000862c5bbe47da52a3a1dac05.png

Java

Observable values = Observable.range(100, 10);

Subscription subscription = values

.elementAt(2)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.range(100,10);

Subscriptionsubscription=values

.elementAt(2)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

102

Completed

1

2

3

102

Completed

该函数和访问数组或者集合类似,如果 Observable 发射的数据个数没有这么多,则会抛出 java.lang.IndexOutOfBoundsException 。可以使用一个默认值(elementAtOrDefault)来避免抛出 java.lang.IndexOutOfBoundsException。

Java

Observable values = Observable.range(100, 10);

Subscription subscription = values

.elementAtOrDefault(22, 0)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

Observablevalues=Observable.range(100,10);

Subscriptionsubscription=values

.elementAtOrDefault(22,0)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

0

Completed

1

2

3

0

Completed

sequenceEqual

本节最后这个操作函数是用来比较两个 Observable 发射的数据是否是一样的,同样位置的数据是一样的。要求两个 Observable 发射的数据个数是一样的并且每个位置上的数据也是一样的。 该函数内部用 Object.equals 来比较数据,当然你也可以自己指定一个比较函数。

Java

Observable strings = Observable.just("1", "2", "3");

Observable ints = Observable.just(1, 2, 3);

Observable.sequenceEqual(strings, ints, (s,i) -> s.equals(i.toString()))

//Observable.sequenceEqual(strings, ints)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

Observablestrings=Observable.just("1","2","3");

Observableints=Observable.just(1,2,3);

Observable.sequenceEqual(strings,ints,(s,i)->s.equals(i.toString()))

//Observable.sequenceEqual(strings, ints)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

true

Completed

1

2

3

true

Completed

上面使用了自定义的比较函数,所以结果是一样的。 如果不指定自定义的 比较函数的话, 使用默认的 Object.equals 来比较,则返回的结果就是 False 了。

如果一个源 Observable 出现了 错误,则 比较结果的 Observable 也会出现 错误并结束。

Java

Observable values = Observable.create(o -> {

o.onNext(1);

o.onNext(2);

o.onError(new Exception());

});

Observable.sequenceEqual(values, values)

.subscribe(

v -> System.out.println(v),

e -> System.out.println("Error: " + e),

() -> System.out.println("Completed")

);

1

2

3

4

5

6

7

8

9

10

11

12

13

Observablevalues=Observable.create(o->{

o.onNext(1);

o.onNext(2);

o.onError(newException());

});

Observable.sequenceEqual(values,values)

.subscribe(

v->System.out.println(v),

e->System.out.println("Error: "+e),

()->System.out.println("Completed")

);

结果:

Java

Error: java.lang.Exception

1

2

Error:java.lang.Exception

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值