Преобразовать один тип списка в другой RXJava? (Эквивалент карты Javascript)
допустим, у меня есть наблюдаемые
Observable<List<A>>
и я хочу преобразовать его в наблюдаемый как Observable<List<B>>
. Есть ли лучший способ конвертировать List<A>
на List<B>
. Javascript map
как реализация была бы идеальной ситуацией.
3 ответов
можно использовать Observable.from(Iterable<A>)
и Observable<A>
, сопоставьте его (A => B) и преобразуйте в List<B>
С Observable.toList()
Observable.from(Arrays.asList(1, 2, 3))
.map(val -> mapIntToString(val)).toList()
Э. Г.
Observable.from(Arrays.asList(1, 2, 3))
.map(val -> val + "mapped").toList()
.toBlocking().subscribe(System.out::println);
доходность
[1mapped, 2mapped, 3mapped]
я ответил на другой подобный вопрос здесь:https://stackoverflow.com/a/42055221/454449
Я скопировал ответ здесь для удобства (не уверен, что это противоречит правилам):
если вы хотите сохранить Lists
испускается источником Observable
но преобразуйте содержимое, т. е. Observable<List<SourceObject>>
to Observable<List<ResultsObject>>
, вы можете сделать что-то вроде этого:
Observable<List<SourceObject>> source = ...
source.flatMap(list ->
Observable.fromIterable(list)
.map(item -> new ResultsObject(item))
.toList()
.toObservable() // Required for RxJava 2.x
)
.subscribe(resultsList -> ...);
это гарантирует пару вещей:
- количество
Lists
испускаемыеObservable
сохраняется. т. е. если источник испускает 3 списка, на другом конце будет 3 преобразованных списка - используя
Observable.fromIterable()
обеспечит внутреннийObservable
завершается, так чтоtoList()
можно использовать
вы также можете использовать compose который получит наблюдаемый и вернет другой.
Observable.Transformer<Integer, String> transformIntegerToString() {
return observable -> observable.map(String::valueOf);
}
@Test
public void observableWithTransformToString() {
Observable.from(Arrays.asList(1,2,3))
.map(number -> {
System.out.println("Item is Integer:" + Integer.class.isInstance(number));
return number;
})
.compose(transformIntegerToString())
.subscribe(number -> System.out.println("Item is String:" + (String.class.isInstance(number))));
}
здесь вы можете увидеть больше примеров