给出以下代码:

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 **//);

08-26 07:14