Java 如何使用分组映射流?

Java 如何使用分组映射流?,java,mapping,java-stream,Java,Mapping,Java Stream,我有很多孩子 //按parent.id/child.id排序 流儿童流; 说 每个子项都有一个父项 类子类{ 父母; } 现在,如何将流映射到族的流中 类族{ 父母; 列出儿童名单; } 我已经知道了收集器。groupingBy,但是流太长了,所以将它们全部收集到映射中是不适用的。为了将您的子实例分组到系列实例中,您必须处理流,因此需要一个终端操作。您可以使用groupingBy,然后将生成的Map转换为所需的流: Stream<Family> families =

我有很多孩子

//按parent.id/child.id排序
流儿童流;

每个
子项都有一个父项

类子类{
父母;
}
现在,如何将流映射到
族的流中

类族{
父母;
列出儿童名单;
}

我已经知道了
收集器。groupingBy
,但是流太长了,所以将它们全部收集到
映射中是不适用的。

为了将您的
实例分组到
系列
实例中,您必须处理
流,因此需要一个终端操作。您可以使用
groupingBy
,然后将生成的
Map
转换为所需的

Stream<Family> families = 
    childStream.collect(Collectors.groupingBy(Child::getParent))
               .entrySet()
               .stream()
               .map(entry -> new Family(entry.getKey(),entry.getValue()));
流族=
collect(Collectors.groupingBy(Child::getParent))
.entrySet()
.stream()
.map(entry->newfamily(entry.getKey(),entry.getValue());
这是假设您的
类有一个
族(父-父,列出子)
构造函数。

如果流是按父(id)排序的,那么下面是解决方案

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);

@YCF_L如果
映射
只包含一个条目,则可以。这条小溪这么大。这条小溪是从哪里来的?定义“非常长”。您必须处理
的所有
实例,以便构建
实例。即使您只想获得
的第一个
系列
,也无法避免处理整个
。父类
和子类
类型是什么?在我看来像一棵树。这需要在
groupingBy
之后进行一些后处理,或者定制收集器。此外,是否保证输入列表按示例中的顺序排序(宽度优先)?否则,就无法进行延迟分组,因为在列表的最后可能有第一个子级的子级。@jbniset查询来自事件日志表。长度取决于输入循环,但除reduces之外的任何终端节都不适用。要使其工作,父级必须实现equals(),可能hashCode()@TomDrake是这样。@Eran源流非常长。
groupingBy
会注意这个吗?@JinKwon多长是多长?你说的“小心点”是什么意思?
StreamEx.of(childStream)
        .collapse((a, b) -> a.getParent().getId() == b.getParent().getId(), Collectors.toList())
        .map(cl-> new Family(cl.get(0).getParent(), cl))...;
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);