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