Android 使用RxJava从用户列表中提取用户名

Android 使用RxJava从用户列表中提取用户名,android,rx-java,rx-java2,rx-android,Android,Rx Java,Rx Java2,Rx Android,我有下面的方法,其中我使用RxJava从Api获取一些数据,然后我操作这些数据以获得用户名列表和用户列表 public void getUsers(){ disposables = RxUtil.initDisposables(disposables); Disposable disposable = userApiRepository.getUsers() .subscribeOn(Schedulers.io()) .doOnNext(otherUsers -> {

我有下面的方法,其中我使用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);
}
public void getUsers(){
一次性用品=RxUtil.initDisposables(一次性用品);
一次性使用=userApiRepository.getUsers()
.subscribeOn(Schedulers.io())
.doOnNext(其他用户->{
列表名称=新的ArrayList();
for(其他用户其他用户:其他用户){
name.add(otherUser.getDisplayName());
}
String[]userNames=names.toArray(新字符串[names.size()]);
视图。已加载OnUserNames(用户名);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(其他用户->查看.onUsersLoaded(其他用户),
视图::handleError);
一次性。添加(一次性);
}
我不喜欢doOnNext中的这种方法,因为我认为它可以改进,但不确定如何改进

有人能写出更好的解决方案吗

    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));
}

userapi存储库
.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(其他用户->使用用户名更新视图(其他用户,视图))
.subscribe(其他用户->查看.onUsersLoaded(其他用户),
视图::handleError);
私有void updateViewWithUserNames(列出其他用户,查看){
view.onUserNamesLoaded(otherUsers.stream())
.map(其他用户::getDisplayName)
.toArray(字符串[]::new));
}

是-将其移动到您的
subscribe()
块中,但它仍然是相同的代码,几乎没有任何更改。我不确定在这种情况下您想要改进什么,除了使用
doOnNext
而不是
subscribe()
您的代码看起来很好。您可以使用stream代替,
view.onUserNamesLoaded(otherUsers.stream().map(OtherUser::getDisplayName).toArray(String[]::new))
,但您是否可以使用代码应该在
subscribe
中的map运算符还是有争议的,如果您对…内容感到困扰,开始使用Kotlin,它为您提供了Kotlin Collections API。虽然这可能是正确的,但我不确定这是否真的是一种改进。(而且,视图是从schedulers.io()操纵的,我想知道原始问题的代码为什么起作用。)这行吗?
subscribe
中的
otherUsers
现在不是字符串列表,而不是
OtherUser
列表吗?@EpicPandaForce是的,视图更改应该在
observeOn
之后。除此之外,这是主观的。。。我认为你是对的;在这种情况下,它可能应该移动到一个单独的方法。编辑了回复。