给出以下代码:
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();
返回
List<GroupedObservable<>>
。在我的代码中,我需要计算每个GroupedObservable中有多少个对象。如果我使用count()
函数,它将返回一个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,则无法为其分配值。
据我所知,我有两个选择。将每个分组的计数存储在属于该类的字段中,或将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 **//);