UnaryOperator 是 Java 中输入输出类型相同的函数式接口,本质为 Function<T, T> 子接口,常用于 lambda 表达式(如 s -> s.toUpperCase())、方法引用(如 String::trim)及 Stream.map() 等场景。

UnaryOperator 是 Java 中一个函数式接口,专门用于实现“输入类型和输出类型完全相同”的一元操作。它本质是 Function<T, T> 的子接口,因此你只需提供一个接收 T、返回 T 的 lambda 或方法引用即可。
核心用法:用 lambda 直接定义转换逻辑
最常见也最简洁的方式是使用 lambda 表达式,参数和返回值类型自动推断为同一类型:
- 对字符串做大小写转换:
UnaryOperator<String> toUpper = s -> s.toUpperCase(); - 对整数做自增:
UnaryOperator<Integer> increment = i -> i + 1; - 对列表做原地反转(注意:需返回新 List 才符合纯函数语义):
UnaryOperator<List<String>> reverseList = list -> new ArrayList(list).reversed();
用方法引用复用已有逻辑
当已有静态或实例方法满足“T → T”签名时,可直接引用:
- 静态方法:
UnaryOperator<String> trimmer = String::trim; - 实例方法(需绑定对象):
String prefix = "pre_"; UnaryOperator<String> addPrefix = s -> prefix + s;(注意:String::concat 是BiFunction<String, String, String>,不能直接引用,需包装)
配合 Stream API 进行链式转换
UnaryOperator 常用于 Stream.map() 或 Optional.map() 中,保持类型一致性:
立即学习“Java免费学习笔记(深入)”;
-
List<Integer> nums = Arrays.asList(1, 2, 3); List<Integer> doubled = nums.stream().map(x -> x * 2).collect(Collectors.toList());(这里x -> x * 2就是UnaryOperator<Integer>) Optional<String> opt = Optional.of(" hello "); String cleaned = opt.map(String::trim).orElse("");
自定义实现类(极少需要,但有助于理解)
虽然通常用 lambda,但也可显式实现接口:
UnaryOperator<Double> roundToTwo = new UnaryOperator<>() {
@Override
public Double apply(Double d) {
return Math.round(d * 100.0) / 100.0;
}
};或更简洁的匿名内部类写法(Java 8+ 推荐 lambda)。


















