Java:如何流式传输多对一列表(使用 flatMap?)

问题描述 投票:0回答:1

我需要流式传输多对一列表。我相信我需要一个

flatMap
,但我无法让它继续下去。我有以下对象:

用户角色:

@Data
@AllArgsConstructor
public class UserRoles {
  private int userId;
  private Integer projectId;    
  private List<Integer> userRoles;
}

用户项目角色:

public class UserProjectRole {    
  @EmbeddedId private UserProjectRolePk id;
  private User user;
  private Project project;
  private UserRole userRole;
}

给定一个

UserRoles
列表,我需要创建一个新
UserProjectRole
列表。到目前为止我有这个:

List<UserProjectRole> projectRoles = userRolesDtos.stream()
             .map(it -> Stream.of(it.getUserRoles())
                     .flatMap(x -> new UserProjectRole(it.getUserId(), it.getProjectId(), x)))
             .collect(Collectors.toList());

但是

x
是一个
List<Integer>
,当我期望它只是roleId时。有人可以帮忙吗?

java java-stream
1个回答
0
投票

Stream.of()
从可变参数数组创建流。当您传递一个列表时,它会创建一个包含一个元素(即列表)的流。

尝试从列表中获取流。另外

flatMap()
仅适用于流结果(查看顺序和大括号)。

List<UserProjectRole> projectRoles = userRolesDtos.stream()
    // stream of UserProjectRole
    .flatMap(it -> it.getUserRoles().stream()
        // intermediate stream of Integer
        .map(x -> new UserProjectRole(it.getUserId(), it.getProjectId(), x)
        // mapped to intermediate stream of UserProjectRole
    )
    // finished call to flatMap returning a flat stream of UserProjectRole
    .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.