如何使用Java Stream API从对象列表的属性列表生成新列表
Java 8 Stream 实现对象列表转换方案
嘿,刚上手Java 8 Stream对吧?这个从List<objMain>转成List<objUserMain>的需求其实很典型,用flatMap就能完美解决,我给你一步步说明:
核心思路
每个objMain对象里包含一个objUser列表,我们需要把这个列表扁平化——也就是把每个objUser都单独拿出来,再给它配上所属objMain的rid和rname,最终组合成objUserMain对象。
前置准备:确保实体类有访问方法
首先要注意,你的实体类需要有对应的getter方法(或者用Lombok的@Data注解自动生成),这样Stream才能读取属性值。修正后的实体类大概是这样:
class objMain { private Long rid; private List<objUser> list; private String rname; // 生成getter方法 public Long getRid() { return rid; } public List<objUser> getList() { return list; } public String getRname() { return rname; } } class objUser { private String userid; public String getUserid() { return userid; } } class objUserMain { private Long rid; private String rname; private String userid; // 构造方法 public objUserMain(Long rid, String rname, String userid) { this.rid = rid; this.rname = rname; this.userid = userid; } // 可选:toString方法方便调试 @Override public String toString() { return "objUserMain{" + "rid=" + rid + ", rname='" + rname + '\'' + ", userid='" + userid + '\'' + '}'; } }
Stream 实现代码
接下来就是核心的转换逻辑,用flatMap处理扁平化,再用map转换对象:
import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; // 假设你的原始列表是mainList List<objMain> mainList = // 你的原始数据列表 List<objUserMain> resultList = mainList.stream() // 处理可能为null的list,避免空指针异常 .flatMap(main -> Optional.ofNullable(main.getList()) .orElse(Collections.emptyList()) .stream() // 把每个objUser和所属objMain的属性组合成目标对象 .map(user -> new objUserMain(main.getRid(), main.getRname(), user.getUserid()))) .collect(Collectors.toList());
代码细节解释
flatMap:它的作用是把每个objMain对应的objUser小流,合并成一个统一的大流,实现列表扁平化的效果Optional.ofNullable(main.getList()).orElse(Collections.emptyList()):这一步是为了防止objMain里的list为null导致的NullPointerException,如果list为null就用空列表代替map(user -> new objUserMain(...)):把每个objUser和所属objMain的rid、rname组合成目标对象objUserMaincollect(Collectors.toList()):把最终处理好的流收集成List<objUserMain>
这样就能得到你想要的结果啦,要是还有细节问题随时问~
内容的提问来源于stack exchange,提问作者KL Sun
相关产品推荐
相关产品推荐

