UnaryOperator 是 Java 中输入输出同类型的函数式接口,用于安全、可组合的一元转换,支持链式操作、空值防护及不可变更新。

Java 中 UnaryOperator 是一个专用于“同类型一元转换”的函数式接口,签名是 T apply(T t) —— 输入和输出必须是同一类型。它不是用来做数学运算的“操作符”,而是一个语义清晰、类型安全的函数容器,适合构建可读性强、可组合的数据处理逻辑。
核心用法:定义单步转换逻辑
最直接的用法是传入一个 lambda 或方法引用,实现对某个值的变换,并返回同类型新值:
- 字符串清洗:去空格、转大写、去首尾符号等
- 数值自增:注意返回新值,不修改原变量
Integer result = increment.apply(42); // 43,原值 42 不变
- 对象更新(推荐不可变方式):用 record 或 with 方法返回新实例
UnaryOperator
链式组合:andThen 与 compose
多个 UnaryOperator 可自然拼接,全程保持类型一致,无需强制转型:
-
andThen:先执行当前操作,再执行参数操作(从左到右) -
compose:先执行参数操作,再执行当前操作(从右到左)
UnaryOperator
UnaryOperator
// 先 trim → 再 upper → 最后加引号
UnaryOperator
String out = pipeline.apply(" abc "); // "\"ABC\""
配合集合批量处理
ArrayList.replaceAll() 直接接受 UnaryOperator,适合原地更新可变列表元素:
立即学习“Java免费学习笔记(深入)”;
- 要求集合本身可变(如
new ArrayList()),且元素非 null 或已防护 - 操作的是元素引用,若元素是可变对象并被修改,会影响原对象
// 安全处理:null 转空串,再 trim 和 toLowerCase
list.replaceAll(s -> s == null ? "" : s.trim().toLowerCase()); // ["a", "b", ""]
恒等操作与空值防护
UnaryOperator.identity() 是零成本占位符,常用于默认行为或条件拼接:
- 作为管道起点或 fallback 操作
- 结合空值检查,避免 NPE,同时守住
T→T类型契约
UnaryOperator
// 组合使用
UnaryOperator
不复杂但容易忽略:它不自动保证线程安全,也不约束你是否修改原对象;真正发挥价值的前提,是坚持返回新值、避免副作用、明确类型边界。


















