将一个 Single<List<Item>> 转换为 Observable<Item>?

3

目标

我从网络请求调用中获得了一个Single<List<Item>>。最终,我想要将这些项目作为Observable<Item2>Single<List<Item2>>使用。我通过new Item2(Item item)Item转换为Item2

我认为会奏效的方法

Single<List<Item>> items
    .map(Observable::fromIterable) // Single<List> to Observable
    .map(new Function<Observable<Item>, Observable<Item2>>() {
      // I don't really know how I can do it here
    })
    .subscribeOn(//.../)
    .observeOn(//.../);

我以为我可以使用map转换observables的类型,所以我不太明白为什么第二个map的参数是Observable<Item>而不是。
我该如何正确实现这个功能呢?


1
我认为你需要使用flatMap。 - Aluan Haddad
@AluanHaddad,就这样了,谢谢。 - oldergod
2个回答

6
如果我理解正确,您想将Single<List<Item>>转换为Item2对象的流,并能够按顺序处理它们。在这种情况下,您需要将列表转换为可观察对象,使用.toObservable().flatMap(...)按顺序发出项目来更改可观察对象的类型。
例如:
Single<List<Item>> items = Single.just(new ArrayList<>());
items.toObservable()
            .flatMap(new Func1<List<Item>, Observable<Item>>() {
                @Override
                public Observable<Item> call(List<Item> items) {
                    return Observable.from(items);
                }
            })
            .map(new Func1<Item, Item2>() {
                @Override
                public Item2 call(Item item) {
                    return new Item2(item);
                }
            })
            .subscribeOn(//.../)
            .observeOn(//.../);

或者,通过使用方法引用,您可以使此代码更加简单:

items.toObservable()
            .flatMap(Observable::from)
            .map(Item2::new)
            .subscribeOn(//.../)
            .observeOn(//.../)
            .subscribe();

总结:如果你想改变Observable的类型,使用.flatMap()


谢谢!我本来应该使用flatMap,但我用了map - oldergod
有没有一种 Rx 的方法可以将 Item 类型更改为 Item2 并保持 Single<List<T>> 输出?因此,我将拥有一个 Single<List<Item>> 作为输入,并输出一个 Single<List<Item2>> - oldergod
是的,您可以在 .map() 之后使用 .toList().toSingle()(或者只使用 .toList() 如果您不关心特别获取 Single)。 - aleien
1
你可以使用 flatMapObservable() 代替 toObservalble().flatMap() - tynn
很酷!谢谢(: 我不知道那个。 - aleien

1
有一些方法可以做到这一点:

items.flatMapObservable(Observable::fromIterable).map(Item2::new).toList()

// or

items.toObservable.flatMap(Observable::fromIterable).map(Item2::new).toList()

// or

items.toObservable().flatMapIterable(Functions.identity()).map(Item2::new).toList()


第一个是最简单的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接