简化代码

上一篇笔记中,我们创建了Oberver,Observable,并使用订阅建立了两者关系。但是代码略显冗长,这篇笔记中我们使用更简单的代码完成同样的需求。

Observer的不完整定义

RxJava提供了Action0,Action1,...,Action9接口,他们是这样定义的:

public interface Action0 extends Action
{
    void call();
}
public interface Action1<T> extends Action
{
    void call(T var1);
}
public interface Action9<T1, T2, T3, T4, T5, T6, T7, T8, T9> extends Action
{
    void call(T1 var1, T2 var2, T3 var3, T4 var4, T5 var5, T6 var6, T7 var7, T8 var8, T9 var9);
}

实际上,这些接口就是用来传入回调函数的,Action接口的泛型是函数的参数,所有函数返回void类型。

Observer实际上就可以看成一个回调函数,Observable发出某个事件,由一个函数响应这个事件,响应事件的代码就是Observer。因此RxJava提供了这些Action接口,用来简化Observer的写法,例子如下:

//创建被观察者
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>()
{
    @Override
    public void call(Subscriber<? super String> subscriber)
    {
        subscriber.onNext("hello1");
        subscriber.onNext("hello2");
        subscriber.onNext("hello3");
        subscriber.onCompleted();
    }
});
//订阅
observable.subscribe(new Action1<String>()
{
    @Override
    public void call(String s)
    {
        System.out.println(s);
    }
}, new Action1<Throwable>()
{
    @Override
    public void call(Throwable throwable)
    {
    }
}, new Action0()
{
    @Override
    public void call()
    {
        System.out.println("completed");
    }
});

如上述代码,subscribe()函数提供了Action作参数的重载,这种写法可以看成没有创建Observer对象,而是直接传入回调函数。

进一步简化代码

实际上,上面代码中,我们可以把Observable的创建和订阅串起来,然后使用Java8的lambda表达式简化Java传入回调函数的写法。

//简化的代码
Observable.create((subscriber) ->
{
    subscriber.onNext("hello1");
    subscriber.onNext("hello2");
    subscriber.onNext("hello3");
    subscriber.onCompleted();
}).subscribe((s) ->
{
    System.out.println(s);
}, (throwable) ->
{
}, () ->
{
    System.out.println("completed");
});

简化的事件队列

create()是创建事件队列最基本的方法,实际上还有一些简化的写法。 * Observable.from(T[]):将传入的数组或可迭代对象拆分成单个对象依次发送 * Observable.just(T...):将传入的参数依次发送

创建简化的事件队列例子:

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

注意: * 实际上from(),just()也可以看成转换成create(),并多次调用onNext(),最后调用onComplete()。 * 有时,onError和onComplete并不需要,subscribe()提供了这样的重载,只有一个onNext()回调的Action1参数。这里就不演示了。

如上述代码,远远比最初的写法简单了。实际使用中,建议使用这种简化的写法。实际上,使用JavaScript等对函数式编程支持比较好的语言时,并不用像Java这样绕这么多弯,Java代码规范化的优势其实某些时候过于死板,也是一种缺陷。

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