转换单个<list <item>&gt;到一个Observable <item>?

时间:2016-10-01 07:24:54

标签: java rx-java reactive-programming

目标

我从网络请求调用中获得Single<List<Item>>。最后,我想将这些项目用作Observable<Item2>Single<List<Item2>>。我使用ItemItem2转到new Item2(Item item)

我认为会起作用

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(//.../);

我认为我可以使用observables转换map的类型,所以我不明白为什么第二个map的参数是Observable<Item>而不是项目。
我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望将Single<List<Item>>转换为Item2个对象的流,并能够按顺序使用它们。在这种情况下,您需要将list转换为observable,使用.toObservable().flatMap(...)顺序发出项目以更改observable的类型。

例如:

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()

答案 1 :(得分:0)

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

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()

第一个是最简单的。