unaryoperator 是 java 中输入输出类型必须一致的一元转换函数式接口,是 function 的子接口,核心方法为 t apply(t t),支持 lambda、方法引用和自定义类实现,常用于 stream map、optional map 和 atomicreference updateandget 等场景。

UnaryOperator 是 Java 中一个特殊的函数式接口,专门用于实现接收一个参数并返回同类型结果的一元转换操作。它本质上是 Function<t t></t> 的子接口,语义更明确——输入和输出类型必须一致,强调“转换”而非泛化映射。
核心定义与用法特点
其函数签名是:public interface UnaryOperator<t> extends Function<t t></t></t>
只声明一个抽象方法:T apply(T t)。这意味着你不能改变类型,只能对同类型值做变换(如字符串转大写、数字取绝对值、对象字段更新等)。
常见实现方式
-
使用 Lambda 表达式(最常用):
UnaryOperator<string> toUpper = s -> s.toUpperCase();</string>UnaryOperator<integer> abs = x -> Math.abs(x);</integer> -
使用方法引用(简洁清晰):
UnaryOperator<string> trim = String::trim;</string>UnaryOperator<list>> reverse = Collections::reverse;</list>(注意:该操作会修改原列表,需留意副作用) -
实现自定义类(适合复杂逻辑或复用):
class SafeToString implements UnaryOperator<object> { public String apply(Object o) { return o == null ? "null" : o.toString(); } } UnaryOperator<object> safeStr = new SafeToString();</object></object>
典型应用场景
-
Stream 流中元素转换:
List<string> upperList = list.stream().map(String::toUpperCase).collect(Collectors.toList());</string>
此处String::toUpperCase就是UnaryOperator<string></string>的实例。 -
Optional 的 map 操作:
Optional<integer> opt = Optional.of(-5);<br> Integer result = opt.map(Math::abs).orElse(0); // 返回 5</integer> -
原子更新(配合 AtomicReference):
AtomicReference<string> ref = new AtomicReference("hello");<br> ref.updateAndGet(s -> s + " world"); // 变为 "hello world"</string>
注意事项
- 必须保证输入输出类型相同,否则编译不通过;
- 避免在
apply中抛出受检异常,如需处理,应包装为运行时异常或使用自定义函数式接口; - 若转换逻辑有状态或副作用(如修改入参对象),需特别注意线程安全与不可变性约定;
- 可利用默认方法
andThen和compose组合多个一元操作:UnaryOperator<string> trimAndUpper = String::trim.andThen(String::toUpperCase);</string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











