如何使用流将嵌套对象列表转换为具有相似信息的对象列表

问题描述

我有这个数据列表

List<Status> statuses = [
    {
        id: 123
        mainSatus: HA
        MoreInfo: {
            name: max
            status: MM
        }
    },{
        id: 456
        mainSatus: HA
        MoreInfo: {
            name: max
            status: KK
        }
    },{
        id: 777
        mainSatus: OU
        MoreInfo: {
            name: max
            status: KK
        }
    }
];

我想要这样的输出

List<SimilarInfo> similarinfos = [{mainStatus:HA,statueses:[MM,KK]},{mainStatus:OU,statuses:[KK]}];

因此按 mainStatus 与相应的状态分组。

解决方法

您可以执行以下操作:

List<Status> statuses = Arrays.asList(
        new Status(123,"HA",new MoreInfo("max","MM")),new Status(456,"KK")),new Status(777,"OU","KK"))
);

Map<String,List<String>> mainStatusToStatuses = statuses.stream()
        .collect(Collectors.groupingBy(Status::getMainStatus,Collectors.mapping(status -> status.getMoreInfo().getStatus(),Collectors.toList())));

System.out.println(mainStatusToStatuses);

输出:

{OU=[KK],HA=[MM,KK]}

如果您对地图不满意,可以从这里进行:

List<SimilarInfo> similarInfos = mainStatusToStatuses.entrySet().stream()
        .map(entry -> new SimilarInfo(entry.getKey(),entry.getValue()))
        .collect(Collectors.toList());

System.out.println(similarInfos);

输出:

[SimilarInfo(mainStatus=OU,statuses=[KK]),SimilarInfo(mainStatus=HA,statuses=[MM,KK])]