list.replaceall 是 java 8 引入的就地批量修改 list 元素的方法,接收 unaryoperator 函数对每个元素转换并替换,要求纯函数式操作,简洁安全但不支持不可变列表或返回新列表。

List.replaceAll 是 Java 8 引入的便捷方法,用于就地批量修改 List 中的每个元素。它接收一个 UnaryOperator<e></e> 函数式接口作为参数,对列表中每个元素执行转换,并用返回值直接替换原元素。
核心用法:传入 lambda 或方法引用
该方法会遍历列表,将每个元素作为输入传给操作函数,再把结果写回原位置。要求操作必须是无副作用的纯转换(不依赖外部状态、不修改原对象内部字段更安全)。
- 基础示例:将字符串列表全部转大写
list.replaceAll(String::toUpperCase);
- 带逻辑处理:对数字列表做平方并加1
numbers.replaceAll(x -> x * x + 1);
与传统 for 循环的区别
相比手动遍历 + set(i, …),replaceAll 更简洁、语义更明确,且底层已做边界检查和并发安全防护(但不保证线程安全,多线程仍需同步)。
- 自动处理索引,无需关心 size 或越界
- 不可用于不可变列表(如
Arrays.asList()返回的固定大小列表,调用会抛UnsupportedOperationException) - 若元素为 null,lambda 中需自行判空,否则可能触发
NullPointerException
注意事项:null 安全与类型匹配
函数返回类型必须与列表元素类型一致(泛型擦除下靠编译器校验),否则编译失败;若原始元素含 null,而 lambda 未处理,运行时会报错。
- 安全写法示例(处理 null 字符串):
list.replaceAll(s -> s == null ? null : s.trim().toLowerCase());
- 避免在 lambda 中修改原对象状态(如
s.append("x")),除非你明确需要副作用且理解风险
适用场景推荐
适合一次性、统一规则的数据清洗或格式标准化,例如日志字段脱敏、DTO 转 VO 字段映射、数值单位换算等。
- ✅ 推荐:简单映射、字符串处理、数值计算
- ⚠️ 慎用:需条件分支且逻辑复杂、依赖上下文索引、涉及 IO 或远程调用
- ❌ 禁止:用于不可修改列表、或期望返回新列表(此时应选
stream().map().collect())










