使用RxJava将Model类分组到其他Model中

时间:2017-08-21 16:15:08

标签: android list rx-java android-room

我正在使用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

2 个答案:

答案 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。检查给定的示例,让我知道它是否有效。