使用 RxJava 将模型 class 分组到其他模型中

Grouping Model class into other Model with RxJava

我正在使用 Android Room Persistence Library,它是 returns MyModel (Flowable<List<MyModel>>) 列表的一个 Flowable。 MyModel 具有函数 getMonth 其中 returns 一个整数。

我正在尝试将 MyModel 分组到 MyModelWrapper 中,它是 MyModel 列表和整数 (MyModelWrapper(int month, List<MyModel>)) 的包装器 class。

代码应将 MyModel MyModel(0)MyModel(0)MyModel(1)MyModel(2) 的列表分组为 MyModelWrapper MyModelWrapper(0, List(MyModel(0), MyModel(0))MyModelWrapper(1, List(MyModel(1))MyModelWrapper(2, List(MyModel(2)).

我当前的代码没有使用 RxJava

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;

我该如何接受这个?

我尝试使用 first()Flowable 中获取第一个元素,groupBy() 我的密钥,但它返回的是 GroupedObservable,它会以某种方式变成列表,然后转化为列表以转换为 MyModelWrapper。

感谢任何帮助!


我最终使用的解决方案:

getMyModelsFlowable()
    .flatMapIterable(new Function<List<MyModel>, Iterable<MyModel>>() {
        @Override
        public Iterable<MyModel> apply(List<MyModel> models) throws Exception {
            return models;
        }
    }).groupBy(new Function<MyModel, Integer>() {
        @Override
        public Integer apply(MyModel model) throws Exception {
            return model.getMonth();
        }
    }).flatMapSingle(new Function<GroupedFlowable<Integer, MyModel>, SingleSource<MyModelWrapper>>() {
        @Override
        public SingleSource<MyModelWrapper> apply(final GroupedFlowable<Integer, MyModel> group) throws Exception {
            return group.toList().map(new Function<List<MyModel>, MyModelWrapper>() {
                @Override
                public MyModelWrapper apply(List<MyModel> models) throws Exception {
                    return new MyModelWrapper()
                            .setMyModels(models)
                            .setMonth(group.getKey());
                }
            });
        }
    });

您给定代码片段的 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。检查给定的示例,让我知道它是否有效。

您对 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 是如何构造的