【问题标题】:Java streams, trying to turn a Map<String, List<T>> into a Map<String, Map<String, List<T>>> [duplicate]Java 流,试图将 Map<String, List<T>> 转换为 Map<String, Map<String, List<T>>> [重复]
【发布时间】:2021-04-25 16:20:24
【问题描述】:

所以我有以下对象:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StakeHolderTypesDepartmentsNotifications {

    private StakeholderTypeEntity stakeholderTypeEntity;
    private StakeholderDepartmentEntity stakeholderDepartmentEntity;
    private StakeholderEntity stakeholderEntity;
    private StakeholderNotificationEntity stakeholderNotificationEntity;
}

所以我最初有一个这个对象的列表,我把它变成了一个Map&lt;String, List&lt;StakeHolderTypesDepartmentsNotifications&gt;,其中的键是stakeholderDepartmentEntity.getId()

Map<String, List<StakeHolderTypesDepartmentsNotifications>> map =
    stakeholders.stream()
                .filter(entry -> entry.getStakeholderDepartmentEntity() != null)
                .collect(groupingBy(
                        entry -> entry.getStakeholderDepartmentEntity().getId()));

但是现在我想要以下内容:

Map<String, Map<String,List<StakeHolderTypesDepartmentsNotifications>>

顶级map的key是stakeholderTypeEntity.getId(),value是上面的Map,key是stakeholderDepartmentEntity.getId()

【问题讨论】:

  • 我不明白这个问题,你想通过java流将以前的Map更改为新的Map?或者您想通过流式传输之前的Map 来创建新的Map

标签: java dictionary java-stream


【解决方案1】:

你应该可以通过多次应用Collectors.groupingBy来做到这一点:

Map<String, Map<String,List<StakeHolderTypesDepartmentsNotifications>>> result = 
    stakeholders
        .stream()
        .filter(entry -> Objects.nonNull(entry.getStakeholderTypeEntity())
            && Objects.nonNull(entry.getStakeholderDepartmentEntity()))
        .collect(
            Collectors.groupingBy(
                entry -> entry.getStakeholderTypeEntity().getId(),
                Collectors.groupingBy(
                    entry -> entry.getStakeholderDepartmentEntity().getId()
                )
            )
        );

旁白:值得重构字段名称以消除多余的冗长:

public class StakeHolderTypesDepartmentsNotifications {
    // just a model for an sql query that joins across all these tables
    private StakeholderTypeEntity type;
    private StakeholderDepartmentEntity department;
    private StakeholderEntity stakeholder;
    private StakeholderNotificationEntity notification;
}

然后构建地图如下所示:

Map<String, Map<String,List<StakeHolderTypesDepartmentsNotifications>>> result = 
    stakeholders
        .stream()
        .filter(entry -> Objects.nonNull(entry.getType()) && Objects.nonNull(entry.getDepartment()))
        .collect(
            Collectors.groupingBy(
                entry -> entry.getType().getId(),
                Collectors.groupingBy(-> entry.getDepartment().getId())
            )
        );

【讨论】:

    【解决方案2】:

    您可以使用另一个groupingBy 作为下游收集器来实现它:

    Map<String, Map<String, List<StakeHolderTypesDepartmentsNotifications>>> resultMap = 
        stakeholders
                .stream()
                .filter(e -> e.getStakeholderTypeEntity() != null)
                .filter(e -> e.getStakeholderDepartmentEntity() != null)
                .collect(Collectors.groupingBy(
                        e -> e.getStakeholderDepartmentEntity().getId(),
                        Collectors.groupingBy(
                            e -> e.getStakeholderTypeEntity().getId())));
    

    当然,额外检查 getStakeholderTypeEntity() 是否不返回 null 可能是有意义的。

    【讨论】:

      【解决方案3】:
      Map<String, Map<String, List<StakeHolderTypesDepartmentsNotifications>>> result = stakeholders
          .stream()
          .filter(e -> e.getStakeholderTypeEntity() != null && 
                       e.getStakeholderDepartmentEntity() != null)
          .collect(groupingBy(e -> e.getStakeholderTypeEntity().getId(), 
                   groupingBy(e -> e.getStakeholderDepartmentEntity().getId())));
          
      

      【讨论】:

        猜你喜欢
        • 2020-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2015-11-21
        相关资源
        最近更新 更多