【问题标题】:Aggregate objects into collections in Java using streams使用流将对象聚合到 Java 中的集合中
【发布时间】:2020-10-30 12:18:34
【问题描述】:

我有一个结构对象列表

public class SimpleObject {
    private TypeEnum type;
    private String propA;
    private Integer propB;
    private String propC;
}

我想将其“打包”到以下对象中

public class ComplexObject {
    private TypeEnum type;
    private List<SimpleObject> simpleObjects;
}

基于 TypeEnum。
换句话说,我想创建一种聚合,它将包含每个包含某个typeSimpleObject。我想用 Java 8 流来做,但我不知道怎么做。

假设我正在获取SimpleObjects 的列表

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DataService {
    private final DataRepository dataRepo;

    public void getPackedData() {
        dataRepo.getSimpleObjects().stream()...
    }

}

接下来的步骤应该是什么样子?提前感谢您的任何帮助

我正在使用带有 Spring Boot 的 Java 14

【问题讨论】:

标签: java java-stream


【解决方案1】:

您可以使用Collectors.groupingBytype 分组,返回Map&lt;TypeEnum, List&lt;SimpleObject&gt;&gt;。然后再次流过地图的入口集以转换为List&lt;ComplexObject&gt;

List<ComplexObject> res = 
     dataRepo.getSimpleObjects()
        .stream()
        .collect(Collectors.groupingBy(SimpleObject::getType)) //Map<TypeEnum, List<SimpleObject>>
        .entrySet()
        .stream()
        .map(e -> new ComplexObject(e.getKey(), e.getValue()))  // ...Stream<ComplexObject>
        .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    您可以使用Collectors.groupingBy 实现此目的,并使用Collectors.collectingAndThen 进一步将条目转换为对象列表。

    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
    

    我目前不知道其他解决方案,只要 Stream API 在处理字典结构方面不友好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多