SpringBoot中如何扁平化POJO并将子字段值赋给父对象?
实现Company地址扁平化方法
给定以下POJO结构,需要实现flattenAddresses方法:输入一个Company对象,返回一个List<Company>。每个新Company对象保留原对象的name字段,city和country字段取自原对象previousLocations列表中的每个Address实例,最终返回列表的长度与previousLocations的元素数量一致。
修正后的POJO代码
import java.util.ArrayList; import java.util.List; public class Company { String name; String city; String country; List<Address> previousLocations = new ArrayList<>(); // 初始化集合避免空指针异常 } public class Address { String city; String country; Address(String city, String country) { this.city = city; this.country = country; } } public class Main { public static void main(String[] args) { Address a1 = new Address("Toronto", "Canada"); Address a2 = new Address("Oakland", "USA"); Company c = new Company(); c.name = "AB TECH"; c.previousLocations.add(a1); c.previousLocations.add(a2); List<Company> flattened = flattenAddresses(c); } }
flattenAddresses方法实现
方式一:传统循环实现
public static List<Company> flattenAddresses(Company c) { List<Company> resultList = new ArrayList<>(); for (Address addr : c.previousLocations) { Company newCompany = new Company(); newCompany.name = c.name; // 复用原公司名称 newCompany.city = addr.city; newCompany.country = addr.country; resultList.add(newCompany); } return resultList; }
方式二:Java Stream实现
利用Stream的map操作将每个Address转换为新的Company对象,再收集为列表:
import java.util.stream.Collectors; public static List<Company> flattenAddresses(Company c) { return c.previousLocations.stream() .map(addr -> { Company newComp = new Company(); newComp.name = c.name; newComp.city = addr.city; newComp.country = addr.country; return newComp; }) .collect(Collectors.toList()); }
关于flatMap的关联说明
你提到的flatMap核心作用是集合的扁平化处理,适合处理「集合的集合」场景:如果输入是List<Company>(多个Company对象),需要把每个Company的previousLocations都展开为独立的Company对象并合并成一个列表,此时就可以用flatMap实现。示例代码如下:
public static List<Company> flattenMultipleCompanies(List<Company> companies) { return companies.stream() .flatMap(company -> company.previousLocations.stream() .map(addr -> { Company newComp = new Company(); newComp.name = company.name; newComp.city = addr.city; newComp.country = addr.country; return newComp; })) .collect(Collectors.toList()); }
这里flatMap会把每个Company对应的Address流「扁平化」为单个流的元素,最终合并成完整的流后收集为列表。
内容的提问来源于stack exchange,提问作者puneeth choppanati
相关产品推荐
相关产品推荐

