我正在使用Android Room Persistence Library,它返回MyModel列表的Flowable(Flowable<List<MyModel>>
)。 MyModel
具有返回整数的函数getMonth
。
我正在尝试将MyModel分组到MyModelWrapper中,MyModelWrapper是MyModel列表和整数(MyModelWrapper(int month, List<MyModel>)
)的包装类。
代码应将MyModel
MyModel(0)
,MyModel(0)
,MyModel(1)
,MyModel(2)
的列表分组到MyModelWrapper
{{1 },MyModelWrapper(0, List(MyModel(0), MyModel(0))
和MyModelWrapper(1, List(MyModel(1))
。
我当前的代码没有使用RxJava
MyModelWrapper(2, List(MyModel(2))
我怎么会这样做?
我尝试使用List<MyModel> models = database.myModelDao().getMyModels();
Map<Integer, List<MyModel>> orderedData = new HashMap<>();
for(MyModel model : models) {
if(orderedData.get(model.getMonth()) == null) {
orderedData.put(model.getMonth(), new ArrayList<MyModel>());
}
orderedData.get(model.getMonth()).add(model);
}
final ArrayList<MyModelWrapper> recordedModels = new ArrayList<>();
for (Map.Entry<Integer, List<MyModel>> cursor : recordedModels.entrySet()) {
List<MyModel> myModelRecords = cursor.getValue();
MyModelWrapper modelWrapper = new MyModelWrapper()
.setMyModels(myModelRecords)
.setMonth(cursor.getKey());
recordedModels.add(modelWrapper);
}
return recordedModels;
获取Flowable
中的第一个元素,first()
我的密钥,但是返回groupBy()
,这将以某种方式转换为列表,然后转换为要转换为MyModelWrapper的List。
感谢任何帮助!
解决方案我最终使用:
GroupedObservable
答案 0 :(得分:3)
您使用GroupedFlowable
的方法是正确的。
请考虑此测试代码段
@Test
fun modelWrap() {
val data = Flowable.just(listOf(
Model(1, "1"),
Model(2, "2"),
Model(1, "3"),
Model(3, "4")))
val modelsByMonth = data.flatMapIterable { it }.groupBy { it.month }
val wrappedModels = modelsByMonth
.flatMapSingle { group ->
group.toList().map { modelsList -> WrappedModel(group.key, modelsList) }
}
val wrappedModelsList = wrappedModels.toList()
val wrappedModelsVal = wrappedModelsList.blockingGet()
Assert.assertNotNull(wrappedModelsVal)
Assert.assertEquals(3, wrappedModelsVal.size)
}
data class Model(val month: Int, val data: String)
data class WrappedModel(val month: Int?, val data: List<Model>)
它产生输出
[WrappedModel(month=1, data=[Model(month=1, data=1), Model(month=1, data=3)]),
WrappedModel(month=2, data=[Model(month=2, data=2)]),
WrappedModel(month=3, data=[Model(month=3, data=4)])]
我认为你最感兴趣的是构建wrappedModels
val
答案 1 :(得分:0)
您给定代码段的RxJava实现之一可以通过以下方式完成:
Single.<List<MyModel>>create(subscriber -> {
List<MyModel> models = database.myModelDao().getMyModels();
subscriber.onSuccess(models);
}).subscribeOn(Schedulers.io()).map(models -> {
Map<Integer, List<MyModel>> orderedData = new HashMap<>();
for(MyModel model : models) {
if(orderedData.get(model.getMonth()) == null) {
orderedData.put(model.getMonth(), new ArrayList<MyModel>());
}
orderedData.get(model.getMonth()).add(model);
}
final ArrayList<MyModelWrapper> recordedModels = new ArrayList<>();
for (Map.Entry<Integer, List<MyModel>> cursor : recordedModels.entrySet()) {
List<MyModel> myModelRecords = cursor.getValue();
MyModelWrapper modelWrapper = new MyModelWrapper()
.setMyModels(myModelRecords)
.setMonth(cursor.getKey());
recordedModels.add(modelWrapper);
}
return recordedModels;
}).subscribe(recordedModels -> {
// this is where you get your converted list
}, error -> {
// handle exception if any
});
我在您的问题中提到的代码中找不到任何返回的Flowable
。检查给定的示例,让我知道它是否有效。