RxJava的基础使用(二)

来源:互联网 发布:31个省份空间权重矩阵 编辑:程序博客网 时间:2024/04/29 10:14

首先需要介绍Observable.from(),它的作用是传入一个数据集合执行多次直到集合全部释放出来,例如:

Observable.from(urls).subscribe(url -> System.out.println(url));

然后,介绍Observable.flatMap(),

// Returns a List of website URLs based on a text searchObservable<List<String>> query(String text);query("Hello, world!")    .flatMap(new Func1<List<String>, Observable<String>>() {        @Override        public Observable<String> call(List<String> urls) {            return Observable.from(urls);        }    })    .subscribe(url -> System.out.println(url));

这里需要说明的是,传入flatMap的是第一个参数List,而返回的值是Observable,利用Observable.from(urls)的意思就是将url集合分别分次的返回,相当于会返回多次Observable直到url集合全部返回,flatMap()可以返回任意Observable。
假如有这样一个方法:

// 返回网站标题,如果404就返回空Observable<String> getTitle(String URL);现在不打印url了,而是打印每个接受到的网站标题。query("Hello, world!")    .flatMap(urls -> Observable.from(urls))    .flatMap(new Func1<String, Observable<String>>() {        @Override        public Observable<String> call(String url) {            return getTitle(url);        }    })    .subscribe(title -> System.out.println(title));

现在需要把404的情况过滤掉,即不能显示为空:

   query("Hello, world!")        .flatMap(urls -> Observable.from(urls))        .flatMap(url -> getTitle(url))        .filter(title -> title != null)        .subscribe(title -> System.out.println(title));

filter()只会在通过它内部的布尔值检查才会释放接受到的数据,否则不会释放出来。
现在我们最多只显示5个结果:

query("Hello, world!")    .flatMap(urls -> Observable.from(urls))    .flatMap(url -> getTitle(url))    .filter(title -> title != null)    .take(5)    .subscribe(title -> System.out.println(title));

take()最多释放指定的数量。(如果少于5个标题,它很早就会结束)

现在我们希望将标题保存在磁盘上:

query("Hello, world!")    .flatMap(urls -> Observable.from(urls))    .flatMap(url -> getTitle(url))    .filter(title -> title != null)    .take(5)    .doOnNext(title -> saveTitle(title))    .subscribe(title -> System.out.println(title));

doOnNext()允许我们在每次释放一项数据的时候增添额外的行为。
这里有很多RxJava提供的操作符。
出处:www.eoeandroid.com/thread-548157-1-1.html

0 0