使用 java 8 从嵌套列表制作嵌套地图

尼沙卡尔

我有一个嵌套的对象列表。我试图做的是,我需要让它映射。

@Data
@AllArgsConstructor
@NoArgsConstructor
class ReelGroup {
  List<Reel> reelWithGroup;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Reel {
  String reelId;
  List<Group> groups;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Group {
  String groupId;
  String dueDate;
}

示例对象

Group g1 = new Group("G1", "1");
Group g2 = new Group("G2", "2");
Reel reel1 = new Reel("R1", Arrays.asList(g1, g2));

Group g3 = new Group("G1", "3");
Group g4 = new Group("G4", "4");
Reel reel2 = new Reel("R2", Arrays.asList(g3, g4));

ReelGroup reelGroup = new ReelGroup(Arrays.asList(reel1, reel2));

对象如下

[
    {
        reelId:"R1",
        groups:[
            { groupId :"G1", dudeDate:"1"},
            { groupId :"G2", dudeDate:"2"}
        ]
    },
    {
        reelId:"R2",
        groups:[
            { groupId :"G1", dudeDate:"1"},
            { groupId :"G4", dudeDate:"3"}
        ]
    }
]

预期结果,意味着使其成为 Map,

注意:在给定的对象中 ReelIds 不会重复,以及在特定卷轴中,groupIds 不会重复

{
    R2={G1=3, G4=4}, 
    R1={G1=1, G2=2}
}

我试过如下,

reelGroup.getReelWithGroup().stream()
        .collect(
            Collectors.groupingBy(
                e -> e.getReelId(),
                Collectors.collectingAndThen(
                    Collectors.toList(),
                    l ->
                        l.stream()
                            .collect(Collectors.toMap(m -> m.getGroupId(), m -> m.getDueDate())))));

但这不能编译。

当然

你不需要跟 group as 一起去,你可以直接使用toMap().

Map<String, Map<String, String>> collect =
        reelGroup.getReelWithGroup().stream()
            .collect(
                Collectors.toMap(
                    e -> e.getReelId(),
                    v ->
                        v.getGroups().stream()
                            .collect(
                                Collectors.toMap(
                                    g -> g.getGroupId(),
                                    g -> g.getDueDate(),
                                    (existing, current) -> existing)),
                    (existing, current) -> existing));

您可以参考Java 文档假设如果你得到重复(但你提到不会有任何重复),地图不能有重复,你可以使用合并函数作为第三个参数来决定你需要哪些对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章