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

Transform children objects to parent object, grouped by parent

我有以下 类:

class Parent {
   List<Child> children;
}

class Child {
   Parent parent;
}

最初我有一个 Parent 列表。我想执行以下操作:

例如:

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

过滤所有 Children 偶数索引:

[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 列表。请不要在 Parent 对象中修改 children 列表,但我想要最初出现在列表中的相同 Parent 对象。提前致谢!

只需将其映射回来并使用 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(...)

更新二:

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(...)