Извлечение имен пользователей из списка пользователей с помощью RxJava - PullRequest
0 голосов
/ 14 мая 2019

У меня есть следующий метод, где я использую RxJava для получения некоторых данных от Api, а затем я манипулирую этими данными, чтобы получить список имен пользователей и список пользователей.

public void getUsers(){
disposables = RxUtil.initDisposables(disposables);

Disposable disposable = userApiRepository.getUsers()
    .subscribeOn(Schedulers.io())
    .doOnNext(otherUsers -> {
      List<String> names = new ArrayList<>();
      for(OtherUser otherUser: otherUsers){
        names.add(otherUser.getDisplayName());
      }

      String[] userNames = names.toArray(new String[names.size()]);
      view.onUserNamesLoaded(userNames);
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
               view::handleError);

disposables.add(disposable);
}

Мне не нравится этот подход в doOnNext , так как я думаю, что его можно улучшить, но не знаю, как.

Может кто-нибудь написать лучшее решение?

1 Ответ

1 голос
/ 14 мая 2019
    userApiRepository
    .getUsers()
    .subscribeOn(Schedulers.io())
    .flatMapIterable(users -> users)
    .map(OtherUser::getDisplayName)
    .toList()
    .doOnNext(names -> view.onUserNamesLoaded(names.toArray(new String[names.size()])))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
               view::handleError);

Редактировать: это не делает то, что сделал оригинал;Я считаю, что следующее делает:

userApiRepository
    .getUsers()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .doOnNext(otherUsers -> updateViewWithUserNames(otherUsers, view))
    .subscribe(otherUsers -> view.onUsersLoaded(otherUsers),
               view::handleError);

private void updateViewWithUserNames(List<OtherUsers> otherUsers, View view) {
    view.onUserNamesLoaded(otherUsers.stream()
                                     .map(OtherUser::getDisplayName)
                                     .toArray(String[]::new));
}

...