您的位置:首页 > 移动开发 > Android开发

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