RxJava преобразует тип запроса перед вызовом api

#android #java-stream #rx-java #rx-android

#Android #java-поток #rx-java #rx-android

Вопрос:

У меня есть список пользователей (представьте, что пользователь POJO имеет идентификатор как int и имя как строку), и я хочу выполнить вызов API, передающий в качестве параметра список идентификаторов вместо списка пользователей. Итак, как у меня есть:

     List<Integer> usersIDs = new ArrayList<>();
    usersList.stream().forEach(user -> users.add(users.getId()));

    Single.fromCallable(() -> api.downloadData())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe();
 

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

Есть ли способ? Спасибо

Ответ №1:

Как насчет этого?

Вы можете использовать Observable#fromIterable преобразование по порядку из User в Integer (id). Это делается с помощью применения toList . Это можно сделать только в конечном потоке, потому что вы никогда не получите emit, когда Observable никогда не отправляете onComplete . В вашем случае это возможно, потому что a List всегда конечен.

 class So65424108 {
  @Test
  void so65424108() {
    List<User> users = Arrays.asList(new User(1, "Hans"), new User(2, "Wurst"));

    Api api = new ApiImplStub();
    TestScheduler testScheduler = new TestScheduler();

    ReactiveApi reactiveApi = new ReactiveApi(api, testScheduler);

    TestObserver<Boolean> test = Observable.fromIterable(users)
        .map(user -> user.userId)
        .toList()
        .flatMap(reactiveApi::downloadData)
        .observeOn(testScheduler)
        .test();

    testScheduler.triggerActions();

    test.assertComplete().assertValue(false);
  }

  interface Api {
    Boolean downloadData(List<Integer> ids);
  }

  static final class ApiImplStub implements Api {
    @Override
    public Boolean downloadData(List<Integer> ids) {
      return false;
    }
  }

  static final class ReactiveApi {
    private final  Api api;
    private final Scheduler scheduler;

    ReactiveApi(Api api, Scheduler scheduler) {
      this.api = api;
      this.scheduler = scheduler;
    }

    public Single<Boolean> downloadData(List<Integer> ids) {
      return Single.fromCallable(() -> api.downloadData(ids))
          .subscribeOn(scheduler);
    }
  }

  static final class User {
    final int userId;
    final String name;

    User(int userId, String name) {
      this.userId = userId;
      this.name = name;
    }
  }
}