Crazy Zhang
Crazy Zhang

Reputation: 53

RxJava loop in android

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

Answers (1)

dwursteisen
dwursteisen

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

Related Questions