map是不修改原集合、不改变元素数量的中间操作,需接collect()等终端操作才执行;必须用纯函数,避免副作用、null异常、io耗时及key冲突;嵌套结构应使用flatmap而非map。

map 方法不做原地修改,也不会改变元素数量,它只负责“一对一”生成新流 —— 想批量转换集合,必须配合 collect() 或 toArray() 才能得到结果。
map 是中间操作,不触发执行
调用 stream().map() 后你拿到的仍是 Stream,不是 List、Array 或其他集合。没接终端操作(如 collect()、forEach()、count()),整个链式调用就只是定义,不会真正跑起来。
- 常见误写:
list.stream().map(String::toUpperCase)—— 这行代码什么都不会输出,也不会改变list - 正确收尾:
list.stream().map(String::toUpperCase).collect(Collectors.toList()) - 如果目标是数组,用
.toArray(String[]::new),注意构造器引用写法不能漏::new
Function 参数里别写副作用逻辑
map() 的设计前提是“纯函数”:输入确定,输出就唯一,且不修改外部状态。一旦在 lambda 里做 System.out.println()、改字段、写文件,就违背了 Stream 的不可变与并行安全原则。
- 危险写法:
.map(s -> { logger.info(s); return s.trim(); })—— 日志可以,但若换成user.setName(s)就破坏了原对象 - null 值容易爆
NullPointerException:比如users.stream().map(User::getName)遇到null用户直接挂;应先filter(Objects::nonNull)或用Optional.ofNullable(u).map(User::getName).orElse("") - 避免在
map中做 IO 或耗时计算,会拖慢整个流处理,尤其在并行流中更明显
转 Map 时 key 冲突必须显式处理
用 Collectors.toMap() 把流收集成 Map 很方便,但只要 key 重复,就会抛 IllegalStateException: Duplicate key,不像 put() 那样静默覆盖。
- 基础写法:
users.stream().collect(Collectors.toMap(User::getId, u -> u))—— 要求所有getId()返回值唯一 - 有重复 key 时必须传第三个参数(merge function):
(v1, v2) -> v1表示保留第一个值,(v1, v2) -> v2保留第二个 - 如果想用
TreeMap或LinkedHashMap,得传第四个参数构造器:Collectors.toMap(User::getId, User::getName, (a,b)->a, TreeMap::new) - key 本身为
null也会失败,toMap不接受nullkey;可用Collectors.groupingBy()+Collectors.collectingAndThen()曲线救国
嵌套结构别硬套 map,该用 flatMap 时别省事
当源数据是 List<list>></list>、List<string></string> 或返回 Stream 的方法时,map 会产出 Stream<list>></list> 这种嵌套流,无法直接遍历。这时候必须用 flatMap 打平。
- 错误示范:
lists.stream().map(List::stream).collect(Collectors.toList())→ 得到的是List<stream>></stream>,毫无意义 - 正确做法:
lists.stream().flatMap(List::stream).collect(Collectors.toList())→ 才能得到扁平后的List<string></string> - 常见陷阱:把
Optional.map()和Stream.map()混用,前者返回Optional,后者返回Stream,类型系统不兼容,编译不过
最常被忽略的一点:map 后的流只能消费一次。反复调用 collect() 会报 IllegalStateException: stream has already been operated upon。需要复用结果,就老老实实先 collect 到集合里再操作。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











