处理事件队列

Observable发送的事件经常需要经过一些格式转换,过滤等操作,如果有大量这样的变换操作,通常要大量嵌套,导致代码可读性差,RxJava提供了大量的变换操作函数,可以简化变换事件队列的代码。

术语“操作符”:实际上是一个函数,它作为回调参数传入map(),应用对事件队列操作。

map()

map函数可以对Observable发送的所有事件进行加工。map传入的参数类型是Func1接口实现,Func1和Action1比较类似,区别是Func1有一个返回值。这个返回值是map()对事件加工后的结果。

这里我们在上一节代码上继续修改,这里直接使用lambda表达式:

Observable
    .just("hello1", "hello2", "hello3")
    .map((s) -> s + "!")
    .subscribe((s) ->
    {
        System.out.println(s);
    }, (throwable) ->
    {
    }, () ->
    {
        System.out.println("completed");
    });

代码中添加了一个map()操作,对所有字符串加了一个叹号。

运行结果:

hello1!
hello2!
hello3!
completed
Process finished with exit code 0

filter()

应用过滤操作。理解起来十分简单。例子:

String[][] strings = {{"a1", "b1"}, {"a2", "b2"}, {"a3", null}};
Observable
    .from(strings)
    .flatMap((s) -> Observable.from(s))
    .filter((s) -> s != null)
    .subscribe((s) ->
    {
        System.out.println(s);
    }, (throwable) ->
    {
    }, () ->
    {
        System.out.println("completed");
    });

这里我们把null过滤掉,运行结果:

a1
b1
a2
b2
a3
completed
Process finished with exit code

take()

指定接受的事件数量,超过这个数量,就不继续接受了。

String[][] strings = {{"a1", "b1"}, {"a2", "b2"}, {"a3", null}};
Observable
    .from(strings)
    .flatMap((s) -> Observable.from(s))
    .filter((s) -> s != null)
    .take(3)
    .subscribe((s) ->
    {
        System.out.println(s);
    }, (throwable) ->
    {
    }, () ->
    {
        System.out.println("completed");
    });

运行结果:

a1
b1
a2
completed
Process finished with exit code 0

flatmap()

flatmap()将接收到的事件转换成Observable,然后这些Observable又开始发送事件,这些事件全部传入原始的Observable中。 例子:

String[][] strings = {{"a1", "b1"}, {"a2", "b2"}, {"a3", "b3"}};
Observable
    .from(strings)
    .flatMap((s) -> Observable.from(s))
    .subscribe((s) ->
    {
        System.out.println(s);
    }, (throwable) ->
    {
    }, () ->
    {
        System.out.println("completed");
    });

代码中,flatMap的操作是又利用from()生成了若干Observable,然后这些Observable发送事件,统一又原始Observable的Observer接收。如果用map()写上面的代码,免不了要套上层循环。

flatmap()中生成的Observable还可以继续使用flatMap(),达成多层循环。这非常有用,一个Observable是有顺序的,但是多个Observable就可能是并发的,有关flatMap()的应用将在下一节介绍。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。