以下内容整理自AI。在掌握集合的基本概念和用法后,可以作为骨架梳理它在处理大量数据中的作用。
在 Spring Boot Web 开发里,集合的存在感极强——本质原因就一个:Web 开发处理的从来不是"一条"数据,而是"一批"数据,而 JSON 天生就是数组和对象,跟 List/Map 是一一对应的。
所以集合的职责可以概括成四个字:收、转、存、返。
1. 收:接住前端传来的批量数据(最核心)
前端传数组,List 直接接;传键值对对象,Map 或 DTO 接。
// 前端传 ids: [1,2,3]
@PostMapping("/delete")
public Result deleteBatch(@RequestBody List<Long> ids) { ... }
// 前端传 {"name":"张三","age":18},结构不固定时用 Map 兜底
@PostMapping("/search")
public Result search(@RequestBody Map<String, Object> params) { ... }
// 查询参数不固定,用 Map 全接
@GetMapping("/list")
public Result list(@RequestParam Map<String, String> params) { ... }
2. 返:把多条数据吐给前端
List<T> / List<VO> 被 Jackson 自动序列化成 JSON 数组,这是日常最高频的用法;分页结果也是 PageInfo 里包一个 List。
@GetMapping("/users")
public List<UserVO> list() {
return userService.list(); // 直接变 JSON 数组
}
3. 存:持久层的批量读写
- 入参:
WHERE id IN (...)传List,MyBatis 的<foreach>靠的就是集合 - 出参:查多条返回
List<Entity>;不确定列/统计结果返回List<Map<String,Object>> - 批量写:
insertBatch(List<User>)、saveBatch(list)——批量插入能大幅减少数据库往返
4. 转:业务层的数据处理(集合真正"干活"的地方)
这是体现代码功底的地方,配合 Stream 用得最多:
| 场景 | 用法 |
|---|---|
| 去重 | new ArrayList<>(new HashSet<>(list)) |
| 分组 | Collectors.groupingBy(User::getDeptId) → Map<Long, List<User>> |
| 转字典 | Collectors.toMap(User::getId, User::getName) |
| 过滤/提取 | stream().filter().map().collect() |
| 批量查库优化 | 先收集 id 集合 → 一次 IN 查询 → 转 Map,避免循环查库(N+1 问题) |
最后这条尤其关键:把"循环里查数据库"改成"收集成集合 → 批量查一次 → 转 Map 再匹配",是最常见的性能优化手段。
5. 配置与常量
application.yml 里的列表可以直接绑进集合:
app:
white-ips:
- 192.168.1.1
- 10.0.0.1
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private List<String> whiteIps; // 自动绑定
}
此外,Set 常用来做白名单/权限集合(判断存在性 O(1)),Map 常用来做状态码字典、枚举缓存。
选型一句话总结
List:有序、可重复 → 默认首选,收参返参主力Set:去重、快速判断存在 → 权限集合、白名单、去重Map:键值映射 → 字典、分组结果、动态参数、避免嵌套循环查询
Web 开发里,集合就是"多条数据"的搬运容器和处理管道——前端的数组进来,经过集合的过滤分组去重,装进 List 或 Map 再原路返回成 JSON。
浙公网安备 33010602011771号