使用 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 是如何构造的
我正在使用 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 是如何构造的