亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在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條經驗 獲得超6個贊

為了讓您了解這在 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 關注
  • 695 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號