You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java 8 Stream按条件遍历嵌套列表并生成指定Map

Java 8 Stream 实现列表转指定Map结构

实体类定义

public class ClassOne {
   private Long id;
   private List<ClassTwo> secondClass;
   // 需提供getter方法:getId(), getSecondClass()
}

public class ClassTwo {
   private Long link;
   private ClassThree thirdClass;
   // 需提供getter方法:getLink(), getThirdClass()
}

public class ClassThree {
   private Long number;
   // 需提供getter方法:getNumber()
}

可用数据

List<ClassOne> classOneList  
List<Long> referencedNumbers

需求说明

遍历classOneList,生成Map<Long, List<Long>>:

  • 键:ClassOne的id属性
  • 值:满足条件的ClassTwo的link集合
  • 过滤条件:该ClassTwo关联的ClassThree的number值存在于referencedNumbers中

约束条件

  • 必须使用Java 8 Stream实现,禁止使用循环
  • 返回类型严格为Map<Long, List<Long>>

解决方案代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

Map<Long, List<Long>> resultMap = classOneList.stream()
    .collect(Collectors.toMap(
        ClassOne::getId,
        classOne -> classOne.getSecondClass().stream()
            // 过滤符合条件的ClassTwo
            .filter(classTwo -> referencedNumbers.contains(classTwo.getThirdClass().getNumber()))
            // 提取link属性
            .map(ClassTwo::getLink)
            // 收集为List作为Map的值
            .collect(Collectors.toList())
    ));

关键说明

  1. 外层通过Collectors.toMap直接将ClassOne映射为目标键值对结构
  2. 内层对每个ClassOne的secondClass列表开启子Stream,完成条件过滤和属性提取
  3. 若存在重复的ClassOne.id,默认toMap会抛出IllegalStateException,如需处理重复键,可添加合并函数:
Collectors.toMap(
    ClassOne::getId,
    classOne -> /* 内层逻辑 */,
    (existingList, newList) -> {
        existingList.addAll(newList);
        return existingList;
    }
)

内容的提问来源于stack exchange,提问作者Vasanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:45:47