stream api通过函数式编程高效提取共同好友,核心是求两人好友集合交集,适用于中等规模数据,代码简洁可读、易于调试。

用Stream API提取共同好友,核心是把“两人各自好友集合的交集”这个逻辑,用函数式风格高效表达出来。它不依赖MapReduce或图计算框架,适合中等规模数据(几万到百万级用户关系),代码简洁、可读性强、易于调试。
准备基础数据结构
先将原始文本数据转为Java对象。假设每行格式为 A:B,C,D,表示用户A的好友是B、C、D:
- 用 Map
> 存储每个用户及其好友集合,保证去重且查询快 - 读取文件时用 Files.lines() + stream() 流式处理,避免一次性加载全量数据到内存
- 对每行做 split(":") 和 split(","),再用 Collectors.toSet() 构建好友集合
获取任意两人的共同好友
给定两个用户ID(如 "A" 和 "B"),直接调用:
- friendsMap.get("A").stream().filter(friendsMap.get("B")::contains).collect(Collectors.toList())
- 注意提前判空:若任一用户不存在,或其好友集合为null,应返回空列表,避免NPE
- 若需排序或限制数量(如只取前5个),可在filter后接 sorted() 或 limit(5)
批量计算所有有共同好友的用户对
这不是暴力双重循环,而是用Stream组合技巧降低复杂度:
- 先用 friendsMap.entrySet().stream() 遍历所有用户
- 对每个用户u,用 flatMap 展开其好友v,再以(v, u)为键生成用户对(确保u
- 对每对(u,v),计算共同好友集合,用 filter(common -> !common.isEmpty()) 筛出有效结果
- 最终用 Collectors.toMap() 组织为 Map
, List 结构>
性能与边界处理要点
实战中容易卡住的地方不在逻辑,而在细节:
- 原始数据可能含空行、多余空格、大小写不一致——用 map(String::trim) 和 filter(s -> !s.isEmpty()) 清洗
- 好友ID可能含不可见字符(如\uFEFF),建议统一用 strip() 替代 trim()
- 若数据超100万行,考虑用 parallelStream(),但需确保好友集合操作线程安全(Set本身无问题,但collect过程要选线程安全的Collector)
- 导出结果到文件时,别用System.out.println逐行打,改用 Files.write() 批量写入,效率高十倍以上
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











