Java如何使用Stream flatMap处理多对一列表完成UserRoles到UserProjectRole转换
问题修复方案
错误原因
- 调用
Stream.of(it.getUserRoles())时,it.getUserRoles()本身是List<Integer>类型,Stream.of()接收单个集合参数时只会生成包含整个集合作为唯一元素的流,而非集合内部的元素流,所以遍历拿到的x就是完整的List,不是单个roleId。 flatMap要求返回值为Stream类型,原代码直接返回new UserProjectRole不符合方法签名要求,也会导致运行报错。
修复后的代码
要把每个UserRoles里的userRoles列表拆成单个元素,需要调用集合自身的stream()方法拿到单个roleId的流,再用map生成UserProjectRole对象,外层用flatMap把多个流合并成一个:
List<UserProjectRole> projectRoles = userRolesDtos.stream() // 外层遍历每个UserRoles对象 .flatMap(it -> it.getUserRoles().stream() // 内层遍历每个roleId,生成对应的UserProjectRole .map(roleId -> { // 先构造嵌入式主键 UserProjectRolePk pk = new UserProjectRolePk(it.getUserId(), it.getProjectId(), roleId); UserProjectRole upr = new UserProjectRole(); upr.setId(pk); // 若需要补全User、Project、UserRole全量属性,可在此处补充对应查询/构造逻辑 // upr.setUser(userMapper.selectById(it.getUserId())); // upr.setProject(projectMapper.selectById(it.getProjectId())); // upr.setUserRole(userRoleMapper.selectById(roleId)); return upr; }) ) .collect(Collectors.toList());
额外注意点
你给出的UserProjectRole类没有声明三参数构造方法,不能直接调用new UserProjectRole(userId, projectId, roleId),必须先初始化嵌入式主键UserProjectRolePk再赋值给对应属性,或者提前补充对应的构造方法。
内容的提问来源于stack exchange,提问作者aatuc210
相关产品推荐
相关产品推荐

