Java8如何从多层嵌套列表结构中提取指定类成员属性列表
Java 8 如何提取多层嵌套列表中的类成员属性
现有嵌套类结构如下(示例为3层,实际可支持4-5层嵌套):
public class CustomerSales { public List<Product> productList; // 其余属性省略 } public class Product { public List<ProductSubItem> productSubItemList; // 其余属性省略 } public class ProductSubItem { public String itemName; // 其余属性省略 }
错误写法问题说明
你之前的写法仅将Product映射为对应的ProductSubItem列表,最终得到的是List<List<ProductSubItem>>类型的结果,没有做扁平化处理,也没有进一步提取itemName属性。
正确实现方案
使用Stream的flatMap方法做嵌套列表的扁平化,每一层嵌套列表对应一次flatMap调用,最后一层用map提取目标属性:
3层嵌套实现代码
import java.util.stream.Collectors; // 业务逻辑处 List<String> itemNameList = customerSales.productList.stream() // 扁平化第一层嵌套:将每个Product对应的ProductSubItem列表展开为独立的流元素 .flatMap(product -> product.productSubItemList.stream()) // 提取目标属性itemName .map(productSubItem -> productSubItem.itemName) .collect(Collectors.toList());
多层级扩展说明
如果是4-5层嵌套,只需要每多一层嵌套列表,就多加一次flatMap做扁平化即可,示例4层嵌套的写法:
假设ProductSubItem中还有List<ItemParam> paramList属性,ItemParam类中存在目标属性paramCode,实现代码如下:
List<String> paramCodeList = customerSales.productList.stream() .flatMap(product -> product.productSubItemList.stream()) .flatMap(subItem -> subItem.paramList.stream()) .map(itemParam -> itemParam.paramCode) .collect(Collectors.toList());
注意事项
如果嵌套列表可能存在null值,需要在flatMap中增加判空逻辑,避免抛出空指针异常,示例:
.flatMap(product -> product.productSubItemList == null ? Stream.empty() : product.productSubItemList.stream())
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

