Преобразовать один тип списка в другой 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))));

}

здесь вы можете увидеть больше примеров

https://github.com/politrons/reactive