为什么要在订户中完成所有操作时使用flatMap或过滤器?

时间:2015-03-14 12:26:04

标签: android rx-java

如果我可以在订阅部分执行相同的操作(过滤数据),我为什么要使用flatMapfilter等等?

  api
            .getTweetRx()
            .subscribeOn(Schedulers.newThread()) //отдаем новый тред для работы в background
            .observeOn(AndroidSchedulers.mainThread()) //говорим, что обсервить хотим в main thread
            .flatMap(new Func1<List<Tweet>, Observable<Tweet>>() {
                @Override
                public Observable<Tweet> call(List<Tweet> tweets) {
                    return Observable.from(tweets);
                }
            })

        .filter(new Func1<Tweet, Boolean>() {
            @Override
            public Boolean call(Tweet tweet) {
                if (tweet.getImage()!="")
                return true;
                else return false;
            }
        })

            .subscribe(new Action1<Tweet>() {
                           @Override
                           public void call(Tweet tweet) {
                               tweets.add(tweet);
                           }
                       },
                    new Action1<Throwable>() {
                        @Override
                        public void call(Throwable throwable) {
                            Log.d("!!!ERROR", "" + throwable);
                        }
                    },
                    new Action0() { // onComplite
                        @Override
                        public void call() { // // on main thread; all photo's loaded, time to show the list or something.
                            final ListView myList = (ListView) findViewById(R.id.tweet_list);
                            myList.setAdapter(new MyListAdapter(tweets, MainActivity.this));
                        }
                    });

1 个答案:

答案 0 :(得分:0)

关注点的分离(以及利用他人的工作来缩短完成工作所需的时间)。

比较以下代码并确定哪种方法适合您的需求(Scala中的代码,为了进一步利用其他人的工作 - 来削减样板)。

Sample.intsObservable[Int]

Sample.ints.subscribe(new Subscriber[Int] {
  override def onStart(): Unit = println("+++ onStart")
  override def onNext(n: Int): Unit = println(s"+++ onNext: [$n]")
  override def onError(e: Throwable): Unit = println(s"+++ onError: [$e]")
  override def onCompleted(): Unit = println(s"+++ onCompleted")
})

您可能已经注意到订阅者没有做太多事情,只需打印出来的内容。

+++ onStart
+++ onNext: [0]
+++ onNext: [1]
+++ onNext: [2]
+++ onNext: [3]
+++ onNext: [4]
+++ onNext: [5]
+++ onNext: [6]
+++ onNext: [7]
+++ onNext: [8]
+++ onNext: [9]
+++ onNext: [10]
+++ onCompleted

假设我想过滤赔率。我不必更改订阅者的代码,说它不属于我,例如我没有修改和使用的源代码。

使用filter非常简单。

Sample.ints.filter(_ % 2 == 0).subscribe(new Subscriber[Int] {
  override def onStart(): Unit = println("+++ onStart")
  override def onNext(n: Int): Unit = println(s"+++ onNext: [$n]")
  override def onError(e: Throwable): Unit = println(s"+++ onError: [$e]")
  override def onCompleted(): Unit = println(s"+++ onCompleted")
})

看看马,现在没有赔率 - 你只需要添加集成部分 - 观察者和订阅者之间的粘合剂。

+++ onStart
+++ onNext: [0]
+++ onNext: [2]
+++ onNext: [4]
+++ onNext: [6]
+++ onNext: [8]
+++ onNext: [10]
+++ onCompleted

我可以更改订阅者,但前提是您已获得源代码 - 请考虑在您不这样做的情况下可能发生的情况。

等等......