使用流将对象聚合到Java中的集合中

使用流将对象聚合到Java中的集合中,java,java-stream,Java,Java Stream,我有一个结构对象列表 公共类SimpleObject{ 私有类型枚举类型; 私有字符串propA; 私有整数propB; 私有字符串propC; } 我想将其“打包”到以下对象中 公共类ComplexObject{ 私有类型枚举类型; 私有列表simpleObjects; } 基于TypeEnum。 换句话说,我想创建一种聚合,它将保存每个SimpleObject,其中包含特定的类型。我想用Java8流来做,但我不知道怎么做 假设我得到了SimpleObjects的列表 @服务 @Requi

我有一个结构对象列表

公共类SimpleObject{
私有类型枚举类型;
私有字符串propA;
私有整数propB;
私有字符串propC;
}
我想将其“打包”到以下对象中

公共类ComplexObject{
私有类型枚举类型;
私有列表simpleObjects;
}
基于TypeEnum。
换句话说,我想创建一种聚合,它将保存每个
SimpleObject
,其中包含特定的
类型。我想用Java8流来做,但我不知道怎么做

假设我得到了
SimpleObject
s的列表

@服务
@RequiredArgsConstructor(onConstructor=@_u(@Autowired))
公共类数据服务{
私有最终数据存储库dataRepo;
public void getPackedData(){
dataRepo.getSimpleObjects().stream()。。。
}
}
接下来的步骤应该是什么样子?提前感谢您的帮助


我将Java 14与Spring Boot一起使用

您可以使用
收集器。groupingBy
到groupby
类型
,返回
映射
。然后再次在映射的入口集上进行流式转换,以转换为
List

List res=
dataRepo.getSimpleObjects()
.stream()
.collect(收集器.groupingBy(SimpleObject::getType))//映射
.entrySet()
.stream()
.map(e->new ComplexObject(e.getKey(),e.getValue())/…流
.collect(Collectors.toList());

您可以使用
收集器.groupingBy
实现这一点,并使用
收集器将条目进一步转换为对象列表.collecting,然后

List<SimpleObject> list = ...
List<ComplexObject> map = list.stream()
   .collect(Collectors.collectingAndThen(
       Collectors.groupingBy(SimpleObject::getType),                // group by TypeEnum
          map -> map.entrySet()                                     // map entries to ..
             .stream()
             .map(e -> new ComplexObject(e.getKey(), e.getValue())) // .. ComplexObject
             .collect(Collectors.toList())));                       // .. to List
List=。。。
List map=List.stream()
收集,收集收集,然后收集(
Collectors.groupingBy(SimpleObject::getType),//按TypeEnum分组
map->map.entrySet()//将条目映射到。。
.stream()
.map(e->new ComplexObject(e.getKey(),e.getValue())/…ComplexObject
.collect(Collectors.toList());/。。列出

我目前还没有发现另一种解决方案,只要流API在处理字典结构时不友好。

这是否回答了您的问题?
List<SimpleObject> list = ...
List<ComplexObject> map = list.stream()
   .collect(Collectors.collectingAndThen(
       Collectors.groupingBy(SimpleObject::getType),                // group by TypeEnum
          map -> map.entrySet()                                     // map entries to ..
             .stream()
             .map(e -> new ComplexObject(e.getKey(), e.getValue())) // .. ComplexObject
             .collect(Collectors.toList())));                       // .. to List