我有一个很长的孩子。
// ordered by parent.id / child.id
Stream<Child> childStream;
说,
Child(id = 1, parent(id = 1))
Child(id = 2, parent(id = 1))
Child(id = 3, parent(id = 2))
Child(id = 4, parent(id = 2))
Child(id = 5, parent(id = 3))
每个Child
都有一个父级。
class Child {
Parent parent;
}
现在,如何将流映射到Family
?
class Family {
Parent parent;
List<Child> children;
}
我已经知道Collectors.groupingBy
,但是流量很长,将它们全部收集到Map
中是不适用的。
答案 0 :(得分:6)
为了将Child
个实例分组到Family
个实例,您必须处理Stream
,因此需要进行终端操作。您可以使用groupingBy
,然后将生成的Map
转换为您需要的Stream
:
Stream<Family> families =
childStream.collect(Collectors.groupingBy(Child::getParent))
.entrySet()
.stream()
.map(entry -> new Family(entry.getKey(),entry.getValue()));
这是假设您的Family
类有一个Family(Parent parent, List<Child> children)
构造函数。
答案 1 :(得分:1)
如果按父(id)排序流,则StreamEx为解决方案。
StreamEx.of(childStream)
.collapse((a, b) -> a.getParent().getId() == b.getParent().getId(), Collectors.toList())
.map(cl-> new Family(cl.get(0).getParent(), cl))...;
collapse
是比较groupBy
的懒惰评估。例如,如果您只想获得前5个家庭,则只会加载前5个家庭中的孩子,而不是全部。
StreamEx.of(childStream)
.collapse((a, b) -> a.getParent().getId() == b.getParent().getId(), Collectors.toList())
.map(cl-> new Family(cl.get(0).getParent(), cl))
.limit(5);