RxJava响应式函数编程
RxJava最核心的两个东西是
Observables(被观察者,事件源)和subscribers(观察者)。
observables发出一系列事件,subscribers处理这些事件。
一个Observables可以发出
零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的subscribee的onNext方法,最后调用subscribe.onNext()或者subscribe.onError()结束。
RxJava的看起来很像设计模式中的
观察者模式,但是有一点明显不同,那就是如果一个Observerble没有任何的Subscrible没有任何的Subscriber,那么这个Observable是不会发出任何事件的。
使用流程:
- 创建一个Observable对象
- 创建一个Subscriber对象处理Observable对象发出来的字符串
- 通过subscribe函数将定义的observable对象和subscribe对象关联起来,完成subscribe对observable的订阅
- Observable<String> myObservable = Observable.create(
- new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> sub) {
- sub.onNext("Hello, world!");
- sub.onCompleted();
- }
- }
- );
- Subscriber<String> mySubscriber = new Subscriber<String>() {
- @Override
- public void onNext(String s) { System.out.println(s); }
- @Override
- public void onCompleted() { }
- @Override
- public void onError(Throwable e) { }
- };
- myObservable.subscribe(mySubscriber);
RxJava提供了很多便捷的函数来帮助我们减少代码
简化Observable对象的创建过程。RxJava内置了很多简化创建Observable对象的函数,比如Observable.just()就是用来创建只发出一个事件就结束的Observable对象
- Observable<String> myObservable = Observable.just("Hello, world!");
接着也有简化Subscriber的,我们并不关心OnComplete和OnError,我们只需要在OnNext中作出以下处理,使用Action1类
- Action1<String> onNextAction = new Action1<String>() {
- @Override
- public void call(String s) {
- System.out.println(s);
- }
- };
subscribe方法有一个重载版本,接受三个Action1类型的参数,分别对应OnNext,OnComplete, OnError函数。
- myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);
这里我们并不关心onError和onComplete,所以只需要第一个参数就可以
- myObservable.subscribe(onNextAction);
- // Outputs "Hello, world!"
代码最终可以写成这样
- Observable.just("Hello, world!")
- .subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- System.out.println(s);
- }
- });
使用java8的lambda可以使代码更简洁
- Observable.just("Hello, world!")
- .subscribe(s -> System.out.println(s));
操作符(Operators)
操作符就是为了解决Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。RxJava提供了很多有用的操作符。
例如map操作符,用来把一个事件转换成为另外一个事件的。
- Observable.just("Hello, world!")
- .map(new Func1<String, String>() {
- @Override
- public String call(String s) {
- return s + " -Dan";
- }
- })
- .subscribe(s -> System.out.println(s));
使用lambda可以简化的写成
- Observable.just("Hello, world!")
- .map(s -> s + " -Dan")
- .subscribe(s -> System.out.println(s));
map操作符进阶
map操作符的特点是它不必要返回Observable对象返回的类型,可以使用map操作符返回一个发出新的类型的Observable对象
- Observable.just("Hello, world!")
- .map(new Func1<String, Integer>() {
- @Override
- public Integer call(String s) {
- return s.hashCode();
- }
- })
- .subscribe(i -> System.out.println(Integer.toString(i)));
- 2、lambda使用方式
- Observable.just("Hello, world!")
- .map(s -> s.hashCode())
- .subscribe(i -> System.out.println(Integer.toString(i)));
前面说过,Subscriber做的事情越少越好,可以添加多个map操作符
- Observable.just("Hello, world!")
- .map(s -> s.hashCode())
- .map(i -> Integer.toString(i))
- .subscribe(s -> System.out.println(s));