[英]How to convert List<Object> into List<Map<String,String>> in java8
[英]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.