Android RxJava使用介绍(三) RxJava的操作符
2017-01-12 16:25
465 查看
<div class="markdown_views"><p>上一篇文章已经详细讲解了RxJava的创建型操作符,本片文章将继续讲解RxJava操作符,包括:</p> <ul> <li>Transforming Observables(Observable的转换操作符)</li> <li>Filtering Observables(Observable的过滤操作符)</li> </ul> <h2 id="transforming-observablesobservable的转换操作符"><a name="t0"></a>Transforming Observables(Observable的转换操作符)</h2> <h3 id="buffer操作符"><a name="t1"></a>buffer操作符</h3> <p>buffer操作符周期性地收集源Observable产生的结果到列表中,并把这个列表提交给订阅者,订阅者处理后,清空buffer列表,同时接收下一次收集的结果并提交给订阅者,周而复始。</p> <p>需要注意的是,一旦源Observable在产生结果的过程中出现异常,即使buffer已经存在收集到的结果,订阅者也会马上收到这个异常,并结束整个过程。</p> <p>buffer的名字很怪,但是原理很简单,流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/Buffer.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-comment">//定义邮件内容</span> <span class="hljs-keyword">final</span> String[] mails = <span class="hljs-keyword">new</span> String[]{<span class="hljs-string">"Here is an email!"</span>, <span class="hljs-string">"Another email!"</span>, <span class="hljs-string">"Yet another email!"</span>}; <span class="hljs-comment">//每隔1秒就随机发布一封邮件</span> Observable<String> endlessMail = Observable.create(<span class="hljs-keyword">new</span> Observable.OnSubscribe<String>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Subscriber<? <span class="hljs-keyword">super</span> String> subscriber) { <span class="hljs-keyword">try</span> { <span class="hljs-keyword">if</span> (subscriber.isUnsubscribed()) <span class="hljs-keyword">return</span>; Random random = <span 4000 class="hljs-keyword">new</span> Random(); <span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>) { String mail = mails[random.nextInt(mails.length)]; subscriber.onNext(mail); Thread.sleep(<span class="hljs-number">1000</span>); } } <span class="hljs-keyword">catch</span> (Exception ex) { subscriber.onError(ex); } } }).subscribeOn(Schedulers.io()); <span class="hljs-comment">//把上面产生的邮件内容缓存到列表中,并每隔3秒通知订阅者</span> endlessMail.buffer(<span class="hljs-number">3</span>, TimeUnit.SECONDS).subscribe(<span class="hljs-keyword">new</span> Action1<List<String>>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(List<String> list) { System.out.println(String.format(<span class="hljs-string">"You've got %d new messages! Here they are!"</span>, list.size())); <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < list.size(); i++) System.out.println(<span class="hljs-string">"**"</span> + list.get(i).toString()); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul></pre> <p>运行结果如下: <br> You’ve got 3 new messages! Here they are!(after 3s) <br> **Here is an email! <br> **Another email! <br> **Another email! <br> You’ve got 3 new messages! Here they are!(after 6s) <br> **Here is an email! <br> **Another email! <br> **Here is an email! <br> ……</p> <h3 id="flatmap操作符"><a name="t2"></a>flatMap操作符</h3> <p>flatMap操作符是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。</p> <p>flatMap操作符通过传入一个函数作为参数转换源Observable,在这个函数中,你可以自定义转换规则,最后在这个函数中返回一个新的Observable,然后flatMap操作符通过合并这些Observable结果成一个Observable,并依次提交结果给订阅者。</p> <p>值得注意的是,flatMap操作符在合并Observable结果时,有可能存在交叉的情况,如下流程图所示: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/mergeMap.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">private</span> Observable<File> <span class="hljs-title">listFiles</span>(File f){ <span class="hljs-keyword">if</span>(f.isDirectory()){ <span class="hljs-keyword">return</span> Observable.from(f.listFiles()).flatMap(<span class="hljs-keyword">new</span> Func1<File, Observable<File>>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Observable<File> <span class="hljs-title">call</span>(File file) { <span class="hljs-keyword">return</span> listFiles(f); } }); } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">return</span> Observable.just(f); } } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View v) { Observable.just(getApplicationContext().getExternalCacheDir()) .flatMap(<span class="hljs-keyword">new</span> Func1<File, Observable<File>>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Observable<File> <span class="hljs-title">call</span>(File file) { <span class="hljs-comment">//参数file是just操作符产生的结果,这里判断file是不是目录文件,如果是目录文件,则递归查找其子文件flatMap操作符神奇的地方在于,返回的结果还是一个Observable,而这个Observable其实是包含多个文件的Observable的,输出应该是ExternalCacheDir下的所有文件</span> <span class="hljs-keyword">return</span> listFiles(file); } }) .subscribe(<span class="hljs-keyword">new</span> Action1<File>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(File file) { System.out.println(file.getAbsolutePath()); } }); }</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul></pre> <h3 id="concatmap操作符"><a name="t3"></a>concatMap操作符</h3> <p>cancatMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。</p> <p>与flatMap操作符不同的是,concatMap操作符在处理产生的Observable时,采用的是“连接(concat)”的方式,而不是“合并(merge)”的方式,这就能保证产生结果的顺序性,也就是说提交给订阅者的结果是按照顺序提交的,不会存在交叉的情况。</p> <p>concatMap的流程如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/concatMap.png"></p> <p>concatMap的调用例子与flatMap类似,这里不做重复</p> <h3 id="switchmap操作符"><a name="t4"></a>switchMap操作符</h3> <p>switchMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。</p> <p>与flatMap操作符不同的是,switchMap操作符会保存最新的Observable产生的结果而舍弃旧的结果,举个例子来说,比如源Observable产生A、B、C三个结果,通过switchMap的自定义映射规则,映射后应该会产生A1、A2、B1、B2、C1、C2,但是在产生B2的同时,C1已经产生了,这样最后的结果就变成A1、A2、B1、C1、C2,B2被舍弃掉了!流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/switchMap.png"></p> <p>以下是flatMap、concatMap和switchMap的运行实例对比:</p> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering"> <span class="hljs-comment">//flatMap操作符的运行结果</span> Observable.just(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>).flatMap(<span class="hljs-keyword">new</span> Func1<Integer, Observable<Integer>>() { @Override <span class="hljs-keyword">public</span> Observable<Integer> <span class="hljs-title">call</span>(Integer integer) { <span class="hljs-comment">//10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒</span> <span class="hljs-keyword">int</span> delay = <span class="hljs-number">200</span>; <span class="hljs-keyword">if</span> (integer > <span class="hljs-number">10</span>) delay = <span class="hljs-number">180</span>; <span class="hljs-keyword">return</span> Observable.<span class="hljs-keyword">from</span>(<span class="hljs-keyword">new</span> Integer[]{integer, integer / <span class="hljs-number">2</span>}).delay(delay, TimeUnit.MILLISECONDS); } }).observeOn(AndroidSchedulers.mainThread()).subscribe(<span class="hljs-keyword">new</span> Action1<Integer>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer integer) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"flatMap Next:"</span> + integer); } }); <span class="hljs-comment">//concatMap操作符的运行结果</span> Observable.just(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>).concatMap(<span class="hljs-keyword">new</span> Func1<Integer, Observable<Integer>>() { @Override <span class="hljs-keyword">public</span> Observable<Integer> <span class="hljs-title">call</span>(Integer integer) { <span class="hljs-comment">//10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒</span> <span class="hljs-keyword">int</span> delay = <span class="hljs-number">200</span>; <span class="hljs-keyword">if</span> (integer > <span class="hljs-number">10</span>) delay = <span class="hljs-number">180</span>; <span class="hljs-keyword">return</span> Observable.<span class="hljs-keyword">from</span>(<span class="hljs-keyword">new</span> Integer[]{integer, integer / <span class="hljs-number">2</span>}).delay(delay, TimeUnit.MILLISECONDS); } }).observeOn(AndroidSchedulers.mainThread()).subscribe(<span class="hljs-keyword">new</span> Action1<Integer>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer integer) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"concatMap Next:"</span> + integer); } }); <span class="hljs-comment">//switchMap操作符的运行结果</span> Observable.just(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>).switchMap(<span class="hljs-keyword">new</span> Func1<Integer, Observable<Integer>>() { @Override <span class="hljs-keyword">public</span> Observable<Integer> <span class="hljs-title">call</span>(Integer integer) { <span class="hljs-comment">//10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒</span> <span class="hljs-keyword">int</span> delay = <span class="hljs-number">200</span>; <span class="hljs-keyword">if</span> (integer > <span class="hljs-number">10</span>) delay = <span class="hljs-number">180</span>; <span class="hljs-keyword">return</span> Observable.<span class="hljs-keyword">from</span>(<span class="hljs-keyword">new</span> Integer[]{integer, integer / <span class="hljs-number">2</span>}).delay(delay, TimeUnit.MILLISECONDS); } }).observeOn(AndroidSchedulers.mainThread()).subscribe(<span class="hljs-keyword">new</span> Action1<Integer>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer integer) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"switchMap Next:"</span> + integer); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li></ul></pre> <p>运行结果如下: <br> flatMap Next:20 <br> flatMap Next:10 <br> flatMap Next:30 <br> flatMap Next:15 <br> flatMap Next:10 <br> flatMap Next:5</p> <p>switchMap Next:30 <br> switchMap Next:15</p> <p>concatMap Next:10 <br> concatMap Next:5 <br> concatMap Next:20 <br> concatMap Next:10 <br> concatMap Next:30 <br> concatMap Next:15</p> <h3 id="groupby操作符"><a name="t5"></a>groupBy操作符</h3> <p>groupBy操作符是对源Observable产生的结果进行分组,形成一个类型为GroupedObservable的结果集,GroupedObservable中存在一个方法为getKey(),可以通过该方法获取结果集的Key值(类似于HashMap的key)。</p> <p>值得注意的是,由于结果集中的GroupedObservable是把分组结果缓存起来,如果对每一个GroupedObservable不进行处理(既不订阅执行也不对其进行别的操作符运算),就有可能出现内存泄露。因此,如果你对某个GroupedObservable不进行处理,最好是对其使用操作符take(0)处理。</p> <p>groupBy操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/groupBy.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering">Observable.interval(<span class="hljs-number">1</span>, TimeUnit.SECONDS).take(<span class="hljs-number">10</span>).groupBy(<span class="hljs-keyword">new</span> Func1<Long, Long>() { @Override <span class="hljs-keyword">public</span> Long <span class="hljs-title">call</span>(Long <span class="hljs-keyword">value</span>) { <span class="hljs-comment">//按照key为0,1,2分为3组</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">value</span> % <span class="hljs-number">3</span>; } }).subscribe(<span class="hljs-keyword">new</span> Action1<GroupedObservable<Long, Long>>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(GroupedObservable<Long, Long> result) { result.subscribe(<span class="hljs-keyword">new</span> Action1<Long>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Long <span class="hljs-keyword">value</span>) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"key:"</span> + result.getKey() +<span class="hljs-string">", value:"</span> + <span class="hljs-keyword">value</span>); } }); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre> <p>运行结果如下: <br> key:0, value:0 <br> key:1, value:1 <br> key:2, value:2 <br> key:0, value:3 <br> key:1, value:4 <br> key:2, value:5 <br> key:0, value:6 <br> key:1, value:7 <br> key:2, value:8 <br> key:0, value:9</p> <h3 id="map操作符"><a name="t6"></a>map操作符</h3> <p>map操作符是把源Observable产生的结果,通过映射规则转换成另一个结果集,并提交给订阅者进行处理。</p> <p>map操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/map.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs lasso has-numbering">Observable<span class="hljs-built_in">.</span>just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>)<span class="hljs-built_in">.</span><span class="hljs-built_in">map</span>(<span class="hljs-literal">new</span> Func1<span class="hljs-subst"><</span><span class="hljs-built_in">Integer</span>, <span class="hljs-built_in">Integer</span><span class="hljs-subst">></span>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-built_in">Integer</span> call(<span class="hljs-built_in">Integer</span> <span class="hljs-built_in">integer</span>) { <span class="hljs-comment">//对源Observable产生的结果,都统一乘以3处理</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">integer</span><span class="hljs-subst">*</span><span class="hljs-number">3</span>; } })<span class="hljs-built_in">.</span>subscribe(<span class="hljs-literal">new</span> Action1<span class="hljs-subst"><</span><span class="hljs-built_in">Integer</span><span class="hljs-subst">></span>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-literal">void</span> call(<span class="hljs-built_in">Integer</span> <span class="hljs-built_in">integer</span>) { System<span class="hljs-built_in">.</span>out<span class="hljs-built_in">.</span>println(<span class="hljs-string">"next:"</span> <span class="hljs-subst">+</span> <span class="hljs-built_in">integer</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre> <p>运行结果如下: <br> next:3 <br> next:6 <br> next:9 <br> next:12 <br> next:15 <br> next:18</p> <h3 id="cast操作符"><a name="t7"></a>cast操作符</h3> <p>cast操作符类似于map操作符,不同的地方在于map操作符可以通过自定义规则,把一个值A1变成另一个值A2,A1和A2的类型可以一样也可以不一样;而cast操作符主要是做类型转换的,传入参数为类型class,如果源Observable产生的结果不能转成指定的class,则会抛出ClassCastException运行时异常。</p> <p>cast操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/cast.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering"> Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>).cast(Integer.class).subscribe(<span class="hljs-keyword">new</span> Action1<Integer>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer <span class="hljs-keyword">value</span>) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"next:"</span>+<span class="hljs-keyword">value</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre> <p>运行结果如下: <br> next:1 <br> next:2 <br> next:3 <br> next:4 <br> next:5 <br> next:6</p> <h3 id="scan操作符"><a name="t8"></a>scan操作符</h3> <p>scan操作符通过遍历源Observable产生的结果,依次对每一个结果项按照指定规则进行运算,计算后的结果作为下一个迭代项参数,每一次迭代项都会把计算结果输出给订阅者。</p> <p>scan操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/scan.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>) .scan(<span class="hljs-keyword">new</span> Func2<Integer, Integer, Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Integer <span class="hljs-title">call</span>(Integer sum, Integer item) { <span class="hljs-comment">//参数sum就是上一次的计算结果</span> <span class="hljs-keyword">return</span> sum + item; } }).subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Next: 3 <br> Next: 6 <br> Next: 10 <br> Next: 15 <br> Sequence complete.</p> <h3 id="window操作符"><a name="t9"></a>window操作符</h3> <p>window操作符非常类似于buffer操作符,区别在于buffer操作符产生的结果是一个List缓存,而window操作符产生的结果是一个Observable,订阅者可以对这个结果Observable重新进行订阅处理。</p> <p>window操作符有很多个重载方法,这里只举一个简单的例子,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/window5.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Observable<span class="hljs-preprocessor">.interval</span>(<span class="hljs-number">1</span>, TimeUnit<span class="hljs-preprocessor">.SECONDS</span>)<span class="hljs-preprocessor">.take</span>(<span class="hljs-number">12</span>) <span class="hljs-preprocessor">.window</span>(<span class="hljs-number">3</span>, TimeUnit<span class="hljs-preprocessor">.SECONDS</span>) <span class="hljs-preprocessor">.subscribe</span>(new Action1<Observable<Long>>() { @Override public void <span class="hljs-keyword">call</span>(Observable<Long> observable) { System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string">"subdivide begin......"</span>)<span class="hljs-comment">;</span> observable<span class="hljs-preprocessor">.subscribe</span>(new Action1<Long>() { @Override public void <span class="hljs-keyword">call</span>(Long aLong) { System<span class="hljs-preprocessor">.out</span><span class="hljs-preprocessor">.println</span>(<span class="hljs-string">"Next:"</span> + aLong)<span class="hljs-comment">;</span> } })<span class="hljs-comment">;</span> } })<span class="hljs-comment">;</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul></pre> <p>运行结果如下: <br> subdivide begin…… <br> Next:0 <br> Next:1 <br> subdivide begin…… <br> Next:2 <br> Next:3 <br> Next:4 <br> subdivide begin…… <br> Next:5 <br> Next:6 <br> Next:7 <br> subdivide begin…… <br> Next:8 <br> Next:9 <br> Next:10 <br> subdivide begin…… <br> Next:11</p> <h2 id="filtering-observablesobservable的过滤操作符"><a name="t10"></a>Filtering Observables(Observable的过滤操作符)</h2> <h3 id="debounce操作符"><a name="t11"></a>debounce操作符</h3> <p>debounce操作符对源Observable每产生一个结果后,如果在规定的间隔时间内没有别的结果产生,则把这个结果提交给订阅者处理,否则忽略该结果。</p> <p>值得注意的是,如果源Observable产生的最后一个结果后在规定的时间间隔内调用了onCompleted,那么通过debounce操作符也会把这个结果提交给订阅者。</p> <p>debounce操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/debounce.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.create(<span class="hljs-keyword">new</span> Observable.OnSubscribe<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Subscriber<? <span class="hljs-keyword">super</span> Integer> subscriber) { <span class="hljs-keyword">if</span>(subscriber.isUnsubscribed()) <span class="hljs-keyword">return</span>; <span class="hljs-keyword">try</span> { <span class="hljs-comment">//产生结果的间隔时间分别为100、200、300...900毫秒</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i < <span class="hljs-number">10</span>; i++) { subscriber.onNext(i); Thread.sleep(i * <span class="hljs-number">100</span>); } subscriber.onCompleted(); }<span class="hljs-keyword">catch</span>(Exception e){ subscriber.onError(e); } } }).subscribeOn(Schedulers.newThread()) .debounce(<span class="hljs-number">400</span>, TimeUnit.MILLISECONDS) <span class="hljs-comment">//超时时间为400毫秒</span> .subscribe( <span class="hljs-keyword">new</span> Action1<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer integer) { System.out.println(<span class="hljs-string">"Next:"</span> + integer); } }, <span class="hljs-keyword">new</span> Action1<Throwable>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Throwable throwable) { System.out.println(<span class="hljs-string">"Error:"</span> + throwable.getMessage()); } }, <span class="hljs-keyword">new</span> Action0() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>() { System.out.println(<span class="hljs-string">"completed!"</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul></pre> <p>运行结果如下: <br> Next:4 <br> Next:5 <br> Next:6 <br> Next:7 <br> Next:8 <br> Next:9 <br> completed!</p> <h3 id="distinct操作符"><a name="t12"></a>distinct操作符</h3> <p>distinct操作符对源Observable产生的结果进行过滤,把重复的结果过滤掉,只输出不重复的结果给订阅者,非常类似于SQL里的distinct关键字。</p> <p>distinct操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/distinct.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>) .distinct() .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Next: 2 <br> Next: 3 <br> Sequence complete.</p> <h3 id="elementat操作符"><a name="t13"></a>elementAt操作符</h3> <p>elementAt操作符在源Observable产生的结果中,仅仅把指定索引的结果提交给订阅者,索引是从0开始的。其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/elementAt.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs cs has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>).elementAt(<span class="hljs-number">2</span>) .subscribe( <span class="hljs-keyword">new</span> Action1<Integer>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Integer integer) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"Next:"</span> + integer); } }, <span class="hljs-keyword">new</span> Action1<Throwable>() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Throwable throwable) { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"Error:"</span> + throwable.getMessage()); } }, <span class="hljs-keyword">new</span> Action0() { @Override <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>() { System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"completed!"</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next:3 <br> completed!</p> <h3 id="filter操作符"><a name="t14"></a>filter操作符</h3> <p>filter操作符是对源Observable产生的结果按照指定条件进行过滤,只有满足条件的结果才会提交给订阅者,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/filter.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>) .filter(<span class="hljs-keyword">new</span> Func1<Integer, Boolean>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Boolean <span class="hljs-title">call</span>(Integer item) { <span class="hljs-keyword">return</span>( item < <span class="hljs-number">4</span> ); } }).subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Next: 2 <br> Next: 3 <br> Sequence complete.</p> <h3 id="oftype操作符"><a name="t15"></a>ofType操作符</h3> <p>ofType操作符类似于filter操作符,区别在于ofType操作符是按照类型对结果进行过滤,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/ofClass.png"> <br> 调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-string">"hello world"</span>, <span class="hljs-keyword">true</span>, <span class="hljs-number">200</span>L, <span class="hljs-number">0.23</span>f) .ofType(Float.class) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Object>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Object item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next: 0.23 <br> Sequence complete.</p> <h3 id="first操作符"><a name="t16"></a>first操作符</h3> <p>first操作符是把源Observable产生的结果的第一个提交给订阅者,first操作符可以使用elementAt(0)和take(1)替代。其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/first.png"> <br> 调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"> Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>) .first() .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Sequence complete.</p> <h3 id="single操作符"><a name="t17"></a>single操作符</h3> <p>single操作符是对源Observable的结果进行判断,如果产生的结果满足指定条件的数量不为1,则抛出异常,否则把满足条件的结果提交给订阅者,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/single.p.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>) .single(<span class="hljs-keyword">new</span> Func1<Integer, Boolean>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Boolean <span class="hljs-title">call</span>(Integer integer) { <span class="hljs-comment">//取大于10的第一个数字</span> <span class="hljs-keyword">return</span> integer><span class="hljs-number">10</span>; } }) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul></pre> <p>运行结果如下: <br> Error: Sequence contains no elements</p> <h3 id="last操作符"><a name="t18"></a>last操作符</h3> <p>last操作符把源Observable产生的结果的最后一个提交给订阅者,last操作符可以使用takeLast(1)替代。其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/last.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>) .last() .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next: 3 <br> Sequence complete.</p> <h3 id="ignoreelements操作符"><a name="t19"></a>ignoreElements操作符</h3> <p>ignoreElements操作符忽略所有源Observable产生的结果,只把Observable的onCompleted和onError事件通知给订阅者。ignoreElements操作符适用于不太关心Observable产生的结果,只是在Observable结束时(onCompleted)或者出现错误时能够收到通知。</p> <p>ignoreElements操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/ignoreElements.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering"> Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>).ignoreElements() .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre> <p>运行结果如下: <br> Sequence complete.</p> <h3 id="sample操作符"><a name="t20"></a>sample操作符</h3> <p>sample操作符定期扫描源Observable产生的结果,在指定的时间间隔范围内对源Observable产生的结果进行采样,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/sample.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.create(<span class="hljs-keyword">new</span> Observable.OnSubscribe<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">call</span>(Subscriber<? <span class="hljs-keyword">super</span> Integer> subscriber) { <span class="hljs-keyword">if</span>(subscriber.isUnsubscribed()) <span class="hljs-keyword">return</span>; <span class="hljs-keyword">try</span> { <span class="hljs-comment">//前8个数字产生的时间间隔为1秒,后一个间隔为3秒</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i < <span class="hljs-number">9</span>; i++) { subscriber.onNext(i); Thread.sleep(<span class="hljs-number">1000</span>); } Thread.sleep(<span class="hljs-number">2000</span>); subscriber.onNext(<span class="hljs-number">9</span>); subscriber.onCompleted(); } <span class="hljs-keyword">catch</span>(Exception e){ subscriber.onError(e); } } }).subscribeOn(Schedulers.newThread()) .sample(<span class="hljs-number">2200</span>, TimeUnit.MILLISECONDS) <span class="hljs-comment">//采样间隔时间为2200毫秒</span> .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li></ul></pre> <p>运行结果如下: <br> Next: 3 <br> Next: 5 <br> Next: 7 <br> Next: 8 <br> Sequence complete.</p> <h3 id="skip操作符"><a name="t21"></a>skip操作符</h3> <p>skip操作符针对源Observable产生的结果,跳过前面n个不进行处理,而把后面的结果提交给订阅者处理,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/skip.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>).skip(<span class="hljs-number">3</span>) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre> <p>运行结果如下: <br> Next: 4 <br> Next: 5 <br> Next: 6 <br> Next: 7 <br> Sequence complete.</p> <h3 id="skiplast操作符"><a name="t22"></a>skipLast操作符</h3> <p>skipLast操作符针对源Observable产生的结果,忽略Observable最后产生的n个结果,而把前面产生的结果提交给订阅者处理,</p> <p>值得注意的是,skipLast操作符提交满足条件的结果给订阅者是存在延迟效果的,看以下流程图即可明白: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/skipLast.png"></p> <p>可以看到skipLast操作符把最后的天蓝色球、蓝色球、紫色球忽略掉了,但是前面的红色球等并不是源Observable一产生就直接提交给订阅者,这里有一个延迟的效果。</p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>).skipLast(<span class="hljs-number">3</span>) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Next: 2 <br> Next: 3 <br> Next: 4 <br> Sequence complete.</p> <h3 id="take操作符"><a name="t23"></a>take操作符</h3> <p>take操作符是把源Observable产生的结果,提取前面的n个提交给订阅者,而忽略后面的结果,其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/take.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">6</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>) .take(<span class="hljs-number">4</span>) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul></pre> <p>运行结果如下: <br> Next: 1 <br> Next: 2 <br> Next: 3 <br> Next: 4 <br> Sequence complete.</p> <h3 id="takefirst操作符"><a name="t24"></a>takeFirst操作符</h3> <p>takeFirst操作符类似于take操作符,同时也类似于first操作符,都是获取源Observable产生的结果列表中符合指定条件的前一个或多个,与first操作符不同的是,first操作符如果获取不到数据,则会抛出NoSuchElementException异常,而takeFirst则会返回一个空的Observable,该Observable只有onCompleted通知而没有onNext通知。</p> <p>takeFirst操作符的流程图如下: <br> <img title="" alt="这里写图片描述" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/takeFirstN.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>).takeFirst(<span class="hljs-keyword">new</span> Func1<Integer, Boolean>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Boolean <span class="hljs-title">call</span>(Integer integer) { <span class="hljs-comment">//获取数值大于3的数据</span> <span class="hljs-keyword">return</span> integer><span class="hljs-number">3</span>; } }) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul></pre> <p>运行结果如下: <br> Next: 4 <br> Sequence complete.</p> <h3 id="takelast操作符"><a name="t25"></a>takeLast操作符</h3> <p>takeLast操作符是把源Observable产生的结果的后n项提交给订阅者,提交时机是Observable发布onCompleted通知之时。其流程图如下: <br> <img title="" alt="这里写图片描述" src="http://reactivex.io/documentation/operators/images/takeLast.n.png"></p> <p>调用例子如下:</p> <pre class="prettyprint" name="code"><code class="hljs java has-numbering">Observable.just(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>).takeLast(<span class="hljs-number">2</span>) .subscribe(<span class="hljs-keyword">new</span> Subscriber<Integer>() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onNext</span>(Integer item) { System.out.println(<span class="hljs-string">"Next: "</span> + item); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span>(Throwable error) { System.err.println(<span class="hljs-string">"Error: "</span> + error.getMessage()); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCompleted</span>() { System.out.println(<span class="hljs-string">"Sequence complete."</span>); } });</code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li></ul></pre> <p>运行结果如下: <br> Next: 6 <br> Next: 7 <br> Sequence complete.</p> <p>不知不觉介绍了那么多操作符,篇幅有点长了,下回继续介绍其他的操作符,敬请期待!</p></div> <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul></ul>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li></li>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
相关文章推荐
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(3) RxJava的操作符及Android事件总线
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(五) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- RxJava 和 RxAndroid 二(操作符的使用)
- [Android]RxJava的简单介绍和基本使用(一)
- RxJava 和 RxAndroid (操作符的使用)
- [Android]RxJava的简单介绍和基本使用(二):retrofit2的简单介绍
- android rxjava入门第二篇操作符的使用