unaryoperator 是 java 8 的函数式接口,用于同类型参数的一元运算,签名 t apply(t t),常用于 stream.map() 和 collection.replaceall(),语义比 function 更明确。

UnaryOperator 是 Java 8 引入的函数式接口,专用于对**同类型参数执行一元运算(即输入和输出类型相同)**,它继承自 Function<t t></t>,因此签名是 T apply(T t)。
核心用法:定义一个 T → T 的变换逻辑
你只需提供一个 lambda 表达式或方法引用,接收一个 T 类型参数,返回一个 T 类型结果。编译器会自动推断类型,无需显式声明泛型。
- 对整数取绝对值:
UnaryOperator<integer> abs = Math::abs;</integer> - 对字符串转大写:
UnaryOperator<string> upper = String::toUpperCase;</string> - 对列表反转(需自定义逻辑):
UnaryOperator<list>> reverse = list -> { Collections.reverse(list); return list; };</list>
常见使用场景:Stream 和集合处理
它最常配合 Stream.map() 或 Collection.replaceAll() 使用,因为这些方法明确要求“同类型映射”。
List<integer> nums = Arrays.asList(-1, 2, -3);<br>nums.replaceAll(Math::abs); // 直接修改原列表:[1, 2, 3]</integer>
Stream<string> stream = Stream.of("hello", "world");<br>stream.map(String::toUpperCase).forEach(System.out::println); // HELLO WORLD</string>
与 Function 的区别:语义更明确
虽然 Function<t t></t> 也能实现相同功能,但 UnaryOperator<t></t> 的命名直接表达了“单操作数、同类型转换”的意图,提升代码可读性与 API 意图清晰度。例如:
- 用
Function<string string></string>做 trim 可以,但不够精准; - 用
UnaryOperator<string></string>做 trim 更准确 —— 它天然暗示“不改变类型,只变换值”。
自定义实现注意点
如果手动实现,必须确保返回值类型与参数类型完全一致(包括泛型擦除后),否则编译失败。例如:
- ✅ 正确:
UnaryOperator<double> square = x -> x * x;</double> - ❌ 错误:
UnaryOperator<integer> bad = x -> (long)x;</integer>(返回 long,类型不匹配)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











