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