RxJava - 使用 GroupedObservable
RxJava - Consuming a GroupedObservable
给定以下代码:
bcxClient
.fetchToDos()
.flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
@Override
public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
return Observable.from(bcxToDos);
}
})
.groupBy(new Func1<BcxToDo, BcxToDoList>() {
@Override
public BcxToDoList call(BcxToDo bcxToDo) {
return bcxToDo.toDoList;
}
})
.toList();
其中returns一个List<GroupedObservable<>>
。在我的代码中,我需要计算每个 GroupedObservable 中有多少个对象。如果我使用 count()
函数,它会 returns 和 Observable<int>
。以下代码将不起作用:
@Override
public int getChildrenCount(int groupPosition) {
int count;
mToDoList.get(groupPosition)
.count()
.subscribe( new Action1<Integer>() {
@Override
public void call(Integer integer) {
count = integer;
}
});
return count;
}
如果我将局部变量设为 final,则无法为其赋值。
据我所知,我有两个选择。将每个分组的计数存储在属于 class 的字段中,或者将 GroupedObservable 转换为链中的备用结构(上图)。如果是这种情况,最好的方法是什么?
这是我为翻译 GroupedObservable 编写的代码:
.flatMap( new Func1<GroupedObservable<BcxToDoList, BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(final GroupedObservable<BcxToDoList, BcxToDo> bcxToDoListBcxToDoGroupedObservable) {
return bcxToDoListBcxToDoGroupedObservable
.toList()
.flatMap( new Func1<List<BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(List<BcxToDo> bcxToDos) {
bcxToDoListBcxToDoGroupedObservable.getKey().toDos.addAll( bcxToDos );
return Observable.just( bcxToDoListBcxToDoGroupedObservable.getKey() );
}
});
}
})
我不确定这是否是最好的方法
您的第一次尝试没有成功,因为 count 是原始值而不是对象。
要获取count
,可以分块取值。 (但是当前线程会阻塞)
@Override
public int getChildrenCount(int groupPosition) {
int count = mToDoList.get(groupPosition).toBlocking().single();
return count;
}
如果您不想阻塞,使用 Pair
类似的结构似乎是个好主意
bcxClient
.fetchToDos()
.flatMap(Observable::from)
.groupBy(bcxToDo-> bcxToDo.toDoList)
.flatMap(todo -> todo.count().map(c -> new Pair(todo, c))
.toList()
.subscribe(pair -> //** iter over your list **//);
给定以下代码:
bcxClient
.fetchToDos()
.flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
@Override
public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
return Observable.from(bcxToDos);
}
})
.groupBy(new Func1<BcxToDo, BcxToDoList>() {
@Override
public BcxToDoList call(BcxToDo bcxToDo) {
return bcxToDo.toDoList;
}
})
.toList();
其中returns一个List<GroupedObservable<>>
。在我的代码中,我需要计算每个 GroupedObservable 中有多少个对象。如果我使用 count()
函数,它会 returns 和 Observable<int>
。以下代码将不起作用:
@Override
public int getChildrenCount(int groupPosition) {
int count;
mToDoList.get(groupPosition)
.count()
.subscribe( new Action1<Integer>() {
@Override
public void call(Integer integer) {
count = integer;
}
});
return count;
}
如果我将局部变量设为 final,则无法为其赋值。
据我所知,我有两个选择。将每个分组的计数存储在属于 class 的字段中,或者将 GroupedObservable 转换为链中的备用结构(上图)。如果是这种情况,最好的方法是什么?
这是我为翻译 GroupedObservable 编写的代码:
.flatMap( new Func1<GroupedObservable<BcxToDoList, BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(final GroupedObservable<BcxToDoList, BcxToDo> bcxToDoListBcxToDoGroupedObservable) {
return bcxToDoListBcxToDoGroupedObservable
.toList()
.flatMap( new Func1<List<BcxToDo>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(List<BcxToDo> bcxToDos) {
bcxToDoListBcxToDoGroupedObservable.getKey().toDos.addAll( bcxToDos );
return Observable.just( bcxToDoListBcxToDoGroupedObservable.getKey() );
}
});
}
})
我不确定这是否是最好的方法
您的第一次尝试没有成功,因为 count 是原始值而不是对象。
要获取count
,可以分块取值。 (但是当前线程会阻塞)
@Override
public int getChildrenCount(int groupPosition) {
int count = mToDoList.get(groupPosition).toBlocking().single();
return count;
}
如果您不想阻塞,使用 Pair
类似的结构似乎是个好主意
bcxClient
.fetchToDos()
.flatMap(Observable::from)
.groupBy(bcxToDo-> bcxToDo.toDoList)
.flatMap(todo -> todo.count().map(c -> new Pair(todo, c))
.toList()
.subscribe(pair -> //** iter over your list **//);