美文网首页
RxJava2.0 操作符Reduce的使用

RxJava2.0 操作符Reduce的使用

作者: evanwo | 来源:发表于2017-01-07 01:17 被阅读691次

最近在学习RxJava,今天在使用的时候遇到了一个问题:

  • 需要将类型转换成另一个类型,两个类相似,可以理解为A类是B类的子集。
  • 得到的是List<A> 需要转化为 List<B> 这里我就表示为List<String> —>List<Integer>。

一开始我的想法很简单,思路也很清晰首先得到一个Observable<String> ,然后将String对象Map转化成Integer,然后就。。。,诶!我突然发现将List<String>逐个发射出来后,竟然不知道怎么合并了,于是我想到“合并”,对了,不是有Merge,Concat,Zip吗?准备做的时候发现这些是用来Observal的,这时候我真的懵逼了,这时候又闪过 一个念头,Map后不是已经将String转成了Integer吗?接下来只要得到List就行了,因为自己刚学Rx没多久,所以只记得buff可以以集合的方式放回,当我已经敲了.buff()的时候突然感觉哪里不对劲来着,平时这种转化我们只要:

List<Integer> listin = new ArrayList<>();
for (String str : liststr){   
 listin.add(Integer.parseInt(str));
}

但是既然我已经在学习RxJava了,是不是得强迫一下自己,不能再这么使用了,对!就是这么喜欢强迫自己,于是去google,发现也没太多的说明,不过看到有人提到了reduce,于是就去Rx官网上查找,果然找到了,经我理解之下,最终实现了,代码如下:

Observable.fromIterable(lista)        
.map(new Function<String, Integer>() {            
@Override            
public Integer apply(String s) throws Exception {                
return Integer.parseInt(s);           
 }        
}).reduceWith(new Callable<List<Integer>>() {           
 @Override           
 public List<Integer> call() throws Exception {           
     return new ArrayList<Integer>();      
      }      
  }, new BiFunction<List<Integer>, Integer, List<Integer>>() {         
   @Override           
 public List<Integer> apply(List<Integer> integers, Integer integer) throws Exception {                              integers.add(integer);           
      return integers;      
      }       
 }).subscribe(new Consumer<List<Integer>>() {              
 @Override             
  public void accept(List<Integer> integers) throws Exception {               
    for (Integer in :integers) {                  
     Timber.e(String.valueOf(in));           
        }             
  }          
 });

效果已然实现了,哈哈,不过后面还发现了一种更简单的方法:

Observable.fromIterable(lista)          
 .map(new Function<String, Integer>() {       
        @Override              
 public Integer apply(String s) throws Exception {              
     return Integer.valueOf(s);             
  }         
  }).toList()
.subscribe(new Consumer<List<Integer>>() {   
 @Override   
 public void accept(List<Integer> integers) throws Exception {    
    for (Integer in :integers) {        
    Timber.e(String.valueOf(in));  
      }  
  }});

没错就是toList,其实还有很多操作符 比如toMap(),toArray()...有兴趣的可以去官网上看看,用法也都差不多,给大家一个建议,遇到不会的操作符,去官网找,然后对着“宝石图”看看应该也就明白了,我现在学习就是这样的。
希望能给到正在学习RxJava并有此困惑的你一点帮助,哇,已经一点多了,我也该去洗澡睡觉啦!晚安。

相关文章

网友评论

      本文标题:RxJava2.0 操作符Reduce的使用

      本文链接:https://www.haomeiwen.com/subject/nhoxbttx.html