RxJava - 按子数据结构分组

RxJava - Grouping by child data structure

在之前的 中,我了解了如何 link 子 ToDo 项目与父 ToDo 列表(使用嵌套的网络服务调用)。我学到了一些很酷的东西,但后来我意识到我进行了错误的 Web 服务调用!

在 Basecamp 中,我可以在一次调用中 return 一个项目的所有 ToDo 项目以及嵌套的 ToDo 列表。我想做的是使用 RxJava 反转结构并处理分组。

而不是:

我愿意:

这是我的待办事项清单的精简版 class:

public class BcxToDoList {
    public String id;
    public String name;

    public List<BcxToDo> toDos = new ArrayList<>();
}

这是待办事项列表 class:

public class BcxToDo {
    public String id;

    public String listId;

    public String content;

    public BcxToDoList toDoList;
}

我想要 return 具有 toDos.

分组的 BcxToDoLists (List<BcxToDoList>) 的列表

这是我到目前为止编写的代码:

bcxClient
  .fetchToDos( SomeProjectId )
  .flatMap(new Func1<List<BcxToDo>, Observable<BcxToDo>>() {
    @Override
    public Observable<BcxToDo> call(List<BcxToDo> bcxToDos) {
      return Observable.from(bcxToDos);
    }
  })
  .groupBy(new Func1<BcxToDo, String>() {
    @Override
    public String call(BcxToDo bcxToDo) {
      return bcxToDo.listId;
    }
  })

我尝试按 bcxToDo.toDoList 分组,但因为这是一个对象,我最终每个 BcxToDo 得到一个 BcxToDoList。按 listId 分组创建所需的分组,但现在我需要将我的 GroupedObservable<String, BcxToDo> 转换为 GroupedObservable<BcxToDoList, BcxToDo>.

即使我计算出了上面的代码,我也不确定这是否是最好的方法。

您可以使用 bcxToDo.toDoList 作为分组的键,但请记住在 class 中实现 equals/hashCode 方法(IntelliJ 可以为您生成一个实现)。在这种情况下,您可能不再需要 BcxToDoList.toDos。 groupBy 输出将是

GroupedObservable<BcxToDoList, BcxToDo>>