为了账号安全,请及时绑定邮箱和手机立即绑定

如何在java中将数据从一个对象列表复制到另一个对象?

如何在java中将数据从一个对象列表复制到另一个对象?

慕标琳琳 2021-11-17 12:33:23
我有以下 2 个对象Team和Group. 我在每个类中都有标准的 getter setter 和 toString 方法,并且不允许修改它们。public class Team {   private List<Team> teams;  private List<TeamMember> members;  private String teamId;    }public class Group {      private List<GroupMember> groupMember;  private List<Group> groups;  private String groupId;}团队可以有一个List<Team>列表类型作为属性,其中List<Group>可以有一个List<Group>作为属性。团队的示例列表如下所示:我想创建反映相同结构的组列表TeamList。这是我到目前为止所得到的。@Servicepublic class GroupService {@AutowiredTeamService teamService;public List<Group> createGroupList(){    List<Group> groups = Collections.emptyList();    List<Team> teams = teamService.createTeamList();    if (teams != null && !teams.isEmpty()) {        groups = teams.stream().map(t -> {            Group group = new Group();            group.setGroupId(t.getTeamId());            //this is to be modified            group.setGroups(getSubgroups(teams, group.getGroupId()));            return group;        }).collect(Collectors.toList());    }    return groups;}private List<Group> getSubgroups(List<Team> teams, String parentGroupName) {    Optional<Team> parentTeam = teams.stream()            .filter(t -> t.getTeamId().equalsIgnoreCase(parentGroupName)).findFirst();    if(parentTeam.isPresent()){        List<Team> subTeams = new ArrayList<>();        List<Group> lstOfGroups = new ArrayList<>();        System.out.println("parentname " + parentTeam.get().getTeamId());        if(parentTeam.get().getTeams() != null){            parentTeam.get().getTeams().stream().forEach(r -> {                subTeams.add(r);            });        }        subTeams.stream().forEach(st -> {            Group gr = new Group();            gr.setGroupId(st.getTeamId());            lstOfGroups.add(gr);            });        return lstOfGroups;    }    return null;             }}我的想法是修改 getSubgroups 方法来为每个给定的路径正确设置子组。(例如:getSubgroubs 可以返回 team2,并将其所有子组设置为 team7)我知道我必须使用递归,但我正在努力寻找解决方案。我怎样才能做到这一点?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以只创建一个方法来将一个方法复制到另一个方法中并递归调用它:


public Group toGroup(Team team) {

    Group result = new Group(team.teamId());

    // this is missing in your sample code

    result.setGroupMembers(transform(team.getTeamMembers());

    List<Group> subGroups = team.getTeams().stream()

        .map(this::toGroup) // recursive call to this method

        .collect(toList());

    result.setSubgroups(subGroups);

    return result;

}

所以你可以做


List<Group> groups = teamService.getTeams()

                         // you should return an empty list if no elements are present

                         .stream()  

                         .map(this::toGroup) // initial call

                         .collect(toList());

您可能还想查看可以自动生成简单映射器的mapstruct。


查看完整回答
反对 回复 2021-11-17
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

为了让您了解这在 mapstruct 中的外观:


@Mapper(componentModel="spring")

interface TeamGroupMapper {

    @Mappings({

        @Mapping(source="teamId", target="groupId"),

        @Mapping(source="teams", target="groups"),

        @Mapping(source="teamMembers", target="groupMembers")

    })

    Group toGroup(Team team);


    List<Group> toGroups(List<Team> teams);

    GroupMember toGroupMember(TeamMember teamMember);

}

将生成实际代码。如果类具有同名的属性(例如,如果id为Team和调用了 id Group?),@Mapping则不需要对其进行注释。


然后,您可以将@Autowire其作为组件使用。


@Component

class YourGroupService implements GroupService {

    @Autowired TeamGroupMapper mapper;

    @Autowired TeamService teamService;


    public List<Group> getGroups() {

        return mapper.toGroups(teamService.getTeams());

    }

}

我确信这段代码实际上不会工作,但它应该让您了解 mapstruct 的作用。我真的很喜欢它避免样板映射代码。


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 663 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信