unaryoperator是function的精准特化,强制输入输出类型一致,提供identity()恒等操作、天然适配replaceall/map、支持andthen/compose链式加工,保障类型安全与纯函数性。

因为 UnaryOperator 就是为“输入和输出类型完全一致”这个场景量身设计的——它不是 Function 的替代品,而是它的精准特化。用它,编译器能立刻校验类型一致性,代码意图一目了然,还能天然规避因泛型擦除或误用 R 类型导致的隐性错误。
它是 Function 的语义强化版
Function
- 调用方无需再确认“返回值是不是还是 String”或“会不会意外变成 Integer”
- IDE 和编译器能在写错时即时报错,比如
UnaryOperator<string> op = s -> s.length();</string>直接编译失败(返回 int,不满足 T→T) - API 设计者用它声明契约:此处只做同类型变换,不引入类型跃迁
identity() 提供零开销的恒等操作标准实现
不需要手写 s -> s 或 x -> x,直接用 UnaryOperator.identity():
- 语义清晰:“我要保持原值,不加工”
- 性能可靠:JVM 对该静态方法有专门优化,比 lambda 表达式更轻量
- 配合 replaceAll、map 等方法时,可读性与安全性兼得,例如:
list.replaceAll(UnaryOperator.identity());
与集合原地更新(如 replaceAll)天然契合
ArrayList 的 replaceAll(UnaryOperator<e>)</e> 方法签名明确要求同类型转换,这正是 UnaryOperator 的主场:
- 避免用 Function
强转带来的类型冗余和理解成本 - 确保每个元素被安全替换为同类型新实例(如把所有字符串转大写、所有数字加 1),不破坏集合类型契约
- 配合 null 安全处理也更自然:可先判空再返回原值或默认值,类型始终稳定
组合操作更可控,副作用边界清晰
借助 andThen / compose 可链式加工,且每一步都维持 T→T:
- 例如:
UnaryOperator<string> clean = s -> s == null ? "" : s.trim();</string>UnaryOperator<string> upper = String::toUpperCase;</string>UnaryOperator<string> pipeline = clean.andThen(upper);</string> - 整个链条中类型始终是 String,不会中途“掉类型”,也不会因某步返回 Optional 或其他包装类型而中断
- 纯函数特性(无状态、不修改入参)让测试和复用变得简单直接
不复杂但容易忽略:选对接口不是为了炫技,而是让类型系统替你守住关键约束。UnaryOperator 就是那个在 T→T 场景里,既省心又少 bug 的正确答案。










