unaryoperator 是 function 的特化接口,要求输入输出类型一致,支持方法引用、lambda 和 andthen 链式调用,适用于 stream.map() 等场景,但需注意 null 安全与纯函数特性。

UnaryOperator 是 Java 函数式接口中 Function<t t></t> 的特化形式,专用于接收一个参数并返回同类型结果,天然适合链式一元运算(如字符串去空格再转小写再截取)。
理解 UnaryOperator 的契约
它继承自 Function<t t></t>,方法签名是 T apply(T t),强制输入输出类型一致。这避免了类型转换开销,也明确了“变换不改变类型”的语义。
- 声明方式简洁:
UnaryOperator<string> trim = String::trim;</string> - 可直接用方法引用、lambda 或已有函数构造
- 所有
Function<t></t>实例都可赋值给UnaryOperator<t></t>,反之亦然
用 andThen 实现链式调用
andThen 是 Function 接口定义的默认方法,UnaryOperator 继承后可直接使用,将多个同类型变换串成流水线:
- 执行顺序从左到右:先 apply 前一个,再将结果传给后一个
- 返回仍是
UnaryOperator<t></t>,支持继续链式组合 - 例如:
UnaryOperator<string> pipeline = String::trim.andThen(String::toLowerCase).andThen(s -> s.substring(0, Math.min(5, s.length())));</string>
结合 Stream API 进行批量处理
在 Stream.map() 中直接传入 UnaryOperator,语义清晰且类型安全:
List<string> result = list.stream().map(trim.andThen(String::strip)).collect(Collectors.toList());</string>- 比嵌套
map()更易读,也避免中间类型推断问题 - 若需复用,可提前定义好组合好的 operator,提升可维护性
注意 null 安全与副作用
UnaryOperator 本身不处理 null,链式中任一环节返回 null 都可能导致后续 NPE:
- 建议在首节点做非空校验,或使用
Objects.requireNonNull包装 - 避免在 lambda 中修改外部状态(如更新全局变量),保持纯函数特性
- 若需异常处理,可用 try-catch 封装逻辑,但不要让 operator 抛出受检异常(否则需包装为 RuntimeException)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











