将子对象转换为父对象,按父对象分组
Transform children objects to parent object, grouped by parent
我有以下 类:
class Parent {
List<Child> children;
}
class Child {
Parent parent;
}
最初我有一个 Parent
列表。我想执行以下操作:
- 将
Parents
的列表转换为 Child
ren 的合并列表
- 过滤
Child
人 的列表
- 转换回
Parent
的列表,其 children
列表仅包含相应的过滤后的 Child
ren
例如:
[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
列表。请不要在 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(...)
我有以下 类:
class Parent {
List<Child> children;
}
class Child {
Parent parent;
}
最初我有一个 Parent
列表。我想执行以下操作:
- 将
Parents
的列表转换为Child
ren 的合并列表
- 过滤
Child
人 的列表
- 转换回
Parent
的列表,其children
列表仅包含相应的过滤后的Child
ren
例如:
[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
列表。请不要在 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(...)