unaryoperator 是 java 中专为同类型一元变换(t → t)设计的函数式接口,本质是 function 的特化,编译期强制类型一致,支持链式组合与恒等操作,适用于字符串清洗、数值调整等场景,不处理 null 或异常,需主动防护。

Java 中 UnaryOperator 是专为“同类型输入输出”设计的函数式接口,本质是 Function<t t></t> 的特化版本。它不处理任意转换,只做 T → T 的纯一元变换,编译期就卡死类型契约,避免误返回其他类型。
核心用途:安全、可链、可复用的同类型加工
它不是用来替代普通方法或泛型工具的,而是当你明确要“对一个值做某种不变类型的改造”时的最佳选择。比如清洗字符串、调整数值、标准化对象状态等。
- 强制类型一致:写
UnaryOperator<string> op = s -> s.length();</string>直接编译失败(返回 int),IDE 立刻报错 - 天然支持链式组合:
andThen和compose拼接后仍保持String → String,不会中途“掉类型” - 内置恒等操作:
UnaryOperator.identity()是零成本占位符,适合条件拼接或默认行为兜底
典型使用场景与写法
最常用在数据流处理和集合原地更新中,语义清晰,无需转型。
-
配合 Stream.map:
list.stream().map(String::trim).map(String::toUpperCase).collect(Collectors.toList())每一步都是UnaryOperator<string></string>,签名完全匹配 -
集合原地替换(replaceAll):
list.replaceAll(String::trim);或numbers.replaceAll(x -> x * x);要求集合可变(如 ArrayList),且元素非 null 或已防护 -
构建可复用管道:
UnaryOperator<string> clean = s -> s == null ? "" : s.trim();</string>UnaryOperator<string> pipeline = clean.andThen(String::toUpperCase).andThen(s -> "[" + s + "]");</string>
必须注意的边界问题
真实数据常含 null、空串、非法状态,但 UnaryOperator 本身不处理异常或空值——它只定义契约。健壮性靠你主动加防。
- 字符串空值:统一转空串或跳过,例如
s -> s == null ? "" : s.trim() - 数值类型:可用
Objects.requireNonNull(x)显式抛异常,或结合 Optional 封装后再 map,但注意这会改变类型,需在外层处理 - 不可变性原则:所有操作应返回新值,不修改原始对象(如 String 不变,List 不直接 set)
和 Function 的关键区别
别为了省一个泛型参数而硬套 UnaryOperator。如果逻辑天然需要变类型(比如 String → Integer),就该用 Function<string integer></string>。强行用 UnaryOperator 只会导致绕弯子(如包装成 UnaryOperator<string></string> 再 parse,破坏语义)。
- Function:适用于类型转换(
T → R),灵活但类型松散 - UnaryOperator:适用于同类型精炼(
T → T),严格但语义精准 - 选哪个,看业务意图是否“保持类型不变”——而不是看代码写起来简不简单
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











