stream.map() 的核心作用是将流中每个元素按规则一对一转换为新类型元素,不改变原数据且延迟执行,需配合终端操作触发,本质是接收 function 的类型变换操作。

map 本质是“一对一类型变换”
它接收一个 Function
-
stream.map(String::length)→Stream<integer></integer>(String → Integer) -
stream.map(User::getEmail)→Stream<string></string>(User → String) -
stream.map(n -> new BigDecimal(n))→Stream<bigdecimal></bigdecimal>(Integer → BigDecimal)
常见映射方式直接对应业务场景
不需要额外工具类,用法贴近直觉:
-
字段提取:用方法引用最简洁,如
users.stream().map(User::getName) -
基础类型转换:如
ints.stream().map(Long::valueOf)或strings.stream().map(Integer::parseInt)(注意捕获 NumberFormatException) -
构造新对象:支持构造器引用或静态工厂,如
stream.map(OrderDTO::fromOrder)或stream.map(o -> new OrderDTO(o.getId(), o.getTotal()))
类型安全和空值要主动处理
map 不自动过滤 null,也不做类型检查,出错往往在运行时:
- 若源流可能含 null,提前加
.filter(Objects::nonNull),或在 lambda 内判空,如u -> u == null ? null : u.getName() - 返回类型必须严格匹配泛型 R,比如想转成
Stream<long></long>,就不能写map(i -> (long)i)(会推断为Stream<object></object>),而要用map(Integer::longValue)或显式强转
别混淆 map 和原始类型专用方法
如果目标是 int / long / double 基本类型,优先考虑特化方法:
-
mapToInt()返回IntStream,避免装箱开销,适合求和、统计等场景 -
mapToLong()、mapToDouble()同理 - 普通
map()返回的是包装类型流(Stream<integer></integer>),适合后续继续链式 map 或 collect
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











