RxJava - 按子数据结构分组

时间:2015-03-22 12:25:12

标签: android rx-java

在之前的question中,我发现了如何将子ToDo项目与父ToDo列表链接(使用嵌套的Web服务调用)。我学到了一些很酷的东西,但后来我意识到我正在拨打错误的网络服务电话!

在Basecamp中,我可以使用嵌套的待办事项列表在单个调用中返回项目的所有ToDo项目。我想做的是使用RxJava来反转结构并处理分组。

而不是:

  • 待办事项1
    • 列表1
  • 待办事项2
    • 列表1
  • 待办事项3
    • 清单2
  • 待办事项4
    • 清单2

我想:

  • 清单1
    • ToDo 1
    • ToDo 2
  • 清单2
    • ToDo 3
    • ToDo 4

这是我的待办事项列表类的简化版本:

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

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

这是ToDo List类:

public class BcxToDo {
    public String id;

    public String listId;

    public String content;

    public BcxToDoList toDoList;
}

我想返回一个包含List<BcxToDoList>分组的BcxToDoLists(toDos)列表。

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

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进行分组,但因为这是一个对象,所以每个BcxToDoList最终只有一个BcxToDo。按listId分组会创建所需的分组,但现在我需要将GroupedObservable<String, BcxToDo>翻译为GroupedObservable<BcxToDoList, BcxToDo>

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

1 个答案:

答案 0 :(得分:1)

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

GroupedObservable<BcxToDoList, BcxToDo>>