Java 8 Stream将Set对象内部的对象转换为Map

时间:2019-03-26 06:39:08

标签: java java-8 java-stream

我有一个具有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

我可以将其转换为第一级地图。但是,我不知道如何将第二个“设置”转换为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 :(得分:0)

如果我正确理解了这个问题,则需要一个Map<Integer,Map<Integer,SlaveVO>>,其中外部Map的密钥是主ID,内部Map的密钥是从ID。

我建议通过使用Map获得所有MasterVO,SlaveVO对中的flatMap来创建Stream。然后,您可以通过主ID将此Stream的元素进行分组,并使用Collectors.toMap创建内部的Map

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)));