Java 8 Stream для преобразования объекта внутри объекта набора в карту - PullRequest
0 голосов
/ 26 марта 2019

У меня есть объект, который имеет Set. У каждого Set объекта есть другой объект, в котором также есть Set объекта.

class GroupVO {
    int id;
    Set<MasterVO> master; // This should be changed as Map<masterId, MasterVO>

    //getter, setter
}

class MasterVO {
    int masterId;
    Set<SlaveVO> slave; // This should be changed as Map<slaveId, SlaveVO>

    //getter, setter
}

class SlaveVO {
    int slaveId;
    String title;
    String description;

    //getter, setter
}

И я хочу преобразовать эти Set в Map.

Я могу конвертировать его для первого уровня карты. Но я не знаю, как получить второе преобразование «Set» в Map.

GroupVO groupVO = new GroupVO();
Map<Integer, MasterVO> masterMap = groupVO.getMaster().stream()
    .collect(Collectors.toMap(MasterVO::getMasterId, Function.identity()));

Вместо Function.identity() мне нужно получить доступ к объекту mastervo, и в этом объекте мне нужно преобразовать все Set<Slave> в SlaveMap

Пожалуйста, предложите.

Мне нужно, как, Map<Integre, MasterVO>. Если я получу объект MasterVO, например masterMap.get(101), то внутри него должен быть SlaveMap.

1 Ответ

0 голосов
/ 26 марта 2019

Если я правильно понимаю вопрос, вам нужен Map<Integer,Map<Integer,SlaveVO>>, где ключ внешнего Map является главным идентификатором, а ключ внутреннего Map является идентификатором ведомого.

Я предлагаю создать Map, используя flatMap, чтобы получить Stream всех пар MasterVO, SlaveVO.Затем вы можете сгруппировать элементы этого Stream по главному идентификатору и использовать Collectors.toMap для создания внутреннего Map s.

Map<Integer,Map<Integer,SlaveVO>>
     = groupVO .getMaster()
              .stream()
              .flatMap(m -> m.getSlave()
                             .stream()
                             .map(s -> new SimpleEntry<MasterVO,SlaveVO>(m,s)))
              .collect(Collectors.groupingBy(e -> e.getKey().getID(),
                                             Collectors.toMap(e -> e.getValue().getID(),
                                                              Map.Entry::getValue)));
...