繁体   English   中英

Java:如何转换一个List<t> 到 Map<string,object></string,object></t>

[英]Java: how to convert a List<T> to a Map<String,Object>

我想构建一个章节目录。 我的数据结构如下。

private Map<String, ChapterPage> chapterPageRel;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class ChapterPage {
    @ApiModelProperty(value = "page list")
    private List<Integer> page;
    @ApiModelProperty(value = "page image list")
    private List<String> chapterImageId;
}

我的数据库数据如下。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "tb_electronic_material_resource_rel")
public class ElectronicMaterialResourceRelEntity {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @TableField(value = "material_id")
    private Long materialId;

    @TableField(value = "chapter_image_id")
    private String chapterImageId;

    @TableField(value = "chapter_name")
    private String chapterName;

    @TableField(value = "page")
    private Integer page;
}

我想获取每个chapterName对应的页码和图片,其实我获取的是一个奇怪的map,如下图。

List<ElectronicMaterialResourceRelEntity> materialResourceRelEntities = xxxx;
Map<String, Map<Integer, String>> collect =
    materialResourceRelEntities
    .stream()
    .collect(Collectors.groupingBy(ElectronicMaterialResourceRelEntity::getChapterName, Collectors.toMap(ElectronicMaterialResourceRelEntity::getSort, ElectronicMaterialResourceRelEntity::chapterImageId)));

但我想问一下,如何收集 class 之类的Map<String,ChapterPage>

循环可能在这里更好,除非您需要在代码中的多个位置收集到此类ChapterPage对象,或者您的输入已经是 stream 并且您希望避免先将其具体化到列表中。 只是为了演示这仍然是如何完成的,这是一个使用自定义下游Collector的示例:

Map<String, ChapterPage> res = input.stream()
        .collect(Collectors.groupingBy(ElectronicMaterialResourceRelEntity::chapterName, 
                Collector.of(
                        ChapterPage::new,
                        (c, e) -> {
                            c.getPage().add(e.page());
                            c.getChapterImage().add(e.chapterImageId());
                        },
                        (c1, c2) -> {
                            c1.getPage().addAll(c2.getPage());
                            c2.getChapterImage().addAll(c2.getChapterImage());
                            return c1;
                        }
                        )));

吸气剂和构造函数与您的代码不同,我在测试中为ElectronicMaterialResourceRelEntity使用了一条记录,为ChapterPage使用了一个没有注释魔法的 POJO。


通过“循环”,我不一定是指传统的循环,而是直接使用可变HashMap的功能稍差的方法:

Map<String, ChapterPage> res = new HashMap<>();
input.forEach(e -> {
    ChapterPage c = res.computeIfAbsent(e.chapterName(), k -> new ChapterPage());
    c.getPage().add(e.page());
    c.getChapterImage().add(e.chapterImageId());
});

以不那么冗长的方式产生相同的结果。

可以将List转换为Json,再将Json转换为Map

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM