最近在学习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并有此困惑的你一点帮助,哇,已经一点多了,我也该去洗澡睡觉啦!晚安。
网友评论