Java中如何高效将子列表元素匹配添加至父列表?
问题分析与优化方案
当前实现的性能问题
你当前的实现方式不是最优的,核心问题在于时间复杂度:
- 遍历每个
Product(假设数量为M),每次都要对整个ProductSub列表(假设数量为N)做流式过滤 - 总时间复杂度为O(M*N),当数据量较大时(比如M、N都达到万级),性能会急剧下降
更高效的实现方案
可以通过预分组+哈希查找的方式将时间复杂度降低到O(M+N),具体步骤如下:
- 先将
ProductSub列表按productId分组,存入一个Map<Long, List<ProductSub>> - 遍历
Product列表时,直接从Map中取出对应productId的子列表,无需再遍历整个ProductSub集合
优化后的代码示例
List<Product> productList = ..(从服务获取) List<ProductSub> productSubList = ..(从服务获取) // 第一步:预分组ProductSub Map<Long, List<ProductSub>> productSubMap = productSubList.stream() .collect(Collectors.groupingBy(ProductSub::getProductId)); // 第二步:匹配到对应的Product for (Product productItem : productList) { // 从Map中直接获取,不存在则返回空列表(避免null) List<ProductSub> subList = productSubMap.getOrDefault(productItem.getProductId(), Collections.emptyList()); productItem.setProductSublist(subList); }
额外优化建议
- 如果
ProductSub列表中存在重复的productId+productSubId组合,可以先去重再分组,减少内存占用 - 如果是在数据库层面能关联查询,优先考虑通过SQL的JOIN语句直接查询出关联好的数据,避免在内存中做匹配,性能会更优
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

