Как скопировать данные из одного списка объектов в другой в Java? - PullRequest
0 голосов
/ 14 октября 2018

У меня есть следующие 2 объекта Team и Group.У меня есть стандартные методы получения и получения методов в каждом из этих классов, и я не могу их изменять.

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> как атрибут.

пример списка команд выглядит следующим образом: enter image description here

Я хочу создать список групп, который отражает ту же структуруTeamList.

Это то, что я получил до сих пор.

@Service
public class GroupService {

@Autowired
TeamService 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 ]

0 голосов
/ 15 октября 2018

Чтобы дать вам представление о том, как это будет выглядеть в 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 и Group?), аннотация @Mapping для него не нужна.

Затем вымогу @Autowire это как компонент и использовать его.

@Component
class YourGroupService implements GroupService {
    @Autowired TeamGroupMapper mapper;
    @Autowired TeamService teamService;

    public List<Group> getGroups() {
        return mapper.toGroups(teamService.getTeams());
    }
}

Я уверен, что этот код на самом деле не будет работать, но он должен дать вам представление о том, что делает mapstruct.Мне действительно нравится избегать кода картографирования.

0 голосов
/ 14 октября 2018

Вы можете просто создать один метод для копирования одного в другой и вызвать его рекурсивно:

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 , которая может автоматически генерировать простые картографы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...