Reputation: 53
I have a UserBean like :
class UserBean {
public List<String> userNumber;
public int userId;
public String userName;
}
class UserBeanData {
public String userNumber;
public int userId;
public String userName;
}
Now , i want to circular this bean list and get a piece of data list,like this : [{userId , userName , userNumber},{userId , userName , userNumber},...]. The way I use it now is:
List<UserBean> userBeen = new ArrayList<>();
final List<UserBeanData> userBeanDatas = new ArrayList<>();
Observable.from(userBeen)
.flatMap(new Func1<UserBean, Observable<UserBeanData>>() {
@Override
public Observable<UserBeanData> call(UserBean userBean) {
return Observable.combineLatest(Observable.just(userBean), Observable.from(userBean.userNumber)
, new Func2<UserBean, String, UserBeanData>() {
@Override
public UserBeanData call(UserBean userBean, String s) {
UserBeanData tData = new UserBeanData();
tData.userId = userBean.userId;
tData.userName = userBean.userName;
tData.userNumber = s;
return tData;
}
});
}
})
.subscribe(new Action1<UserBeanData>() {
@Override
public void call(UserBeanData userBeanData) {
userBeanDatas.add(userBeanData);
}
});
Are there any other better ways to achieve this?
Upvotes: 0
Views: 926
Reputation: 11515
flatMap
can take a second argument as result selector (which help to combine results)
flatMapIterable
transform a list to an Observable
with items from the list. As flatMap
, flatMapIterable
can take a result selector
final List<UserBeanData> userBeanDatas = Observable.fromIterable(userBeen)
// emit all numbers and create a UserBeanData for each, using the bean as source
.flatMapIterable(bean -> bean.userNumber, (source, number) -> new UserBeanData(number, source.userId, source.userName))
// transform the observable as a list
.toList()
// get the list
.blockingGet()
Please note that this code targets RxJava 2 but should work with RxJava 1 (change Observable.fromIterable
to Observable.from
and blockingGet
to toBlocking().first()
Upvotes: 1