我需要流式传输多对一列表。我相信我需要一个
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时。有人可以帮忙吗?
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());