在没有for循环和临时数组的情况下,在RxJava中规范化数据模型

时间:2016-09-27 23:33:20

标签: functional-programming rx-java reactive-programming observable

鉴于来自api请求的以下响应,我想使用rxjava将数据模型规范化为更简单的数据模型而不使用任何循环或临时数组来存储信息。

Given: List<MyItem> 
===================

MyItem
String category_name
List<Switch> switches;

Switch
String id
boolean active

Response:
[{
	"category_name": "Sport",
	"switches": [{
		"id": "sport_01",
		"active": true
	}, {
		"id": "sport_02",
		"active": false
	}, {
		"id": "sport_03",
		"active": true
	}]
}, {
    "category_name": "Economy",
	"switches": [{
		"id": "economy_01",
		"active": true
	}, {
		"id": "economy_02",
		"active": true
	}]	
}]

Expected Normalised: List<MyViewModel>
===========================
MyViewModel
String categoryName
String switchId
boolean switchActiveState

Example 
[{
	"category_name": "Sport",
	"id": "sport_01",
	"active": true
}, {
	"category_name": "Sport",
	"id": "sport_02",
	"active": false
}, ...
]

我的第一个方法是以下

Observable<MyItem> mMyItemObservable = mApi.getReponse()
                .map(mToMyItemList)
                .flatMapIterable(mToMyItem)
                .share();

Observable<Switch> switchObservable = mMyItemObservable.flatMap(new Func1<MyItem, Observable<List<Switch>>>() {
            @Override
            public Observable<List<Switch>> call(final MyItem item) {
                return Observable.defer(new Func0<Observable<List<Switch>>>() {
                    @Override public Observable<List<Switch>> call() {
                        return Observable.just(item.switches);
                    }
                });
            }
        }).flatMapIterable(new Func1<List<Switch>, Iterable<Switch>>() {
            @Override
            public Iterable<Switch> call(List<Switch> switches) {
                return switches;
            }
        });    

我试过使用以下

Observale.zip(mMyItemObservable, switchObservable, Func...)
Observale.combineLatest(mMyItemObservable, switchObservable, Func...)

为了产生endResult List但没有成功,因为很可能2个可观察量的长度不同。 即。 mMyItemObservable长度为2(项目),switchObservable长度为5项。

有关将这两个可观测量组合在一起以实现最终结果的替代方法的任何想法吗?

1 个答案:

答案 0 :(得分:3)

您需要flatMap的双元素版本:

mMyItemObservable = 
   mApi.getReponse()
       .map(mToMyItemList)
       .flatMapIterable(mToMyItem)
       .flatMap(item -> Observable.from(item.switches),
          (item, switch) -> new MyViewModel(item, switch)
       );

另外请告诉谁给你这个功课a)进入21世纪并删除所有的m-前缀b)开始在Android上使用Java 8功能(使RxJava更容易生活。