将子对象转换为父对象,按父对象分组

时间:2015-10-27 11:16:20

标签: rx-java

我有以下课程:

class Parent {
   List<Child> children;
}

class Child {
   Parent parent;
}

最初我有一个Parent的列表。我想做以下事情:

  • Parents的列表转换为Child ren
  • 的合并列表
  • 过滤Child ren
  • 的列表
  • 转换回Parent列表,其children列表仅包含相应的已过滤Child

例如:

[Parent1 {[child1, child2]},
 Parent2 {[child3, child4]}]

使用偶数索引过滤所有Child ren:

[Parent1 {[child2]},
 Parent2 {[child4]}]

目前我这样做:

List<Parent> allParents = ...
allParents.flatMap(Observable::from)
        .map(parent -> parent.children)
        .flatMap(Observable::from)
        .filter(child -> child.index % 2 == 0)

但我不知道如何将其转换回所需的Parent列表。请不要在children个对象中修改Parent列表,但我想要最初列在列表中的Parent个对象。提前谢谢!

1 个答案:

答案 0 :(得分:1)

只需将其映射回来并使用distinct:

...
.map(child -> child.parent)
.distinct()
...

<强>更新

如果您使用的是Java 8,那么您可以直接将过滤功能应用于子列表并删除所有不必要的内容:

Observable.from(parents)
.doOnNext(p -> p.children.removeIf(c -> c.index % 2 != 0))
.filter(p -> !p.children.isEmpty())
.subscribe(...)

更新2:

Observable.from(parents)
.flatMapIterable(p -> {
    List<Child> cs = new ArrayList<>(p.children);
    p.children.clear();
    return cs;
})
.filter(c -> c.index % 2 == 0)
.doOnNext(c -> c.parent.children.add(c))
.map(c -> c.parent);
.distinct()
.subscribe(...)