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

map 本质是“一对一类型变换”
它接收一个 Function<T, R> 函数:输入是原元素类型 T,输出是目标类型 R。只要 lambda 或方法引用能返回 R 类型,就能完成映射。比如:
-
stream.map(String::length)→Stream<Integer>(String → Integer) -
stream.map(User::getEmail)→Stream<String>(User → String) -
stream.map(n -> new BigDecimal(n))→Stream<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>,就不能写map(i -> (long)i)(会推断为Stream<Object>),而要用map(Integer::longValue)或显式强转
别混淆 map 和原始类型专用方法
如果目标是 int / long / double 基本类型,优先考虑特化方法:
立即学习“Java免费学习笔记(深入)”;
-
mapToInt()返回IntStream,避免装箱开销,适合求和、统计等场景 -
mapToLong()、mapToDouble()同理 - 普通
map()返回的是包装类型流(Stream<Integer>),适合后续继续链式 map 或 collect


















