string.transform()从jdk 12引入,接收function实现不可变链式转换,等价于function.apply(this),强调语义清晰性,需非null函数,返回新字符串,支持与strip()等方法组合及方法引用复用。

Java 中的 String.transform() 方法从 JDK 12 开始引入,用于对字符串进行不可变的、函数式的数据转换,支持链式调用。它接收一个 Function<string string></string>,将原字符串作为输入,返回转换后的新字符串,原字符串保持不变。
transform 的基本用法
该方法本质是语法糖,等价于 function.apply(this),但语义更清晰,强调“转换”动作。适合与 Stream 或其他函数式 API 风格保持一致。
- 必须传入非 null 的函数,否则抛出
NullPointerException - 返回新字符串,不修改原对象(String 本身不可变)
- 可与其他 String 方法(如
strip()、toLowerCase())组合链式调用
常见链式转换示例
比如处理用户输入:去空格 → 转小写 → 去除重复空格 → 替换敏感词:
String result = " HELLO WORLD! "
.strip() // 去首尾空白
.toLowerCase() // 转小写
.transform(s -> s.replaceAll("\s+", " ")) // 多空格→单空格
.transform(s -> s.replace("world", "java")); // 敏感词替换
最终结果为:"hello java!"
结合方法引用和自定义函数复用
把常用逻辑封装成静态方法,提升可读性和复用性:
public class StringUtils {
public static String removeExtraSpaces(String s) {
return s.replaceAll("\s+", " ").trim();
}
public static String maskPhone(String s) {
return s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2");
}
}
然后链式调用:
String masked = "13812345678"
.transform(StringUtils::removeExtraSpaces)
.transform(StringUtils::maskPhone); // 输出 "138****5678"
注意事项与替代方案
transform() 是 Java 12+ 特性,低版本不可用;若需兼容旧版,可用传统方式模拟:
- 手动调用
function.apply(str) - 用
Objects.requireNonNull(function).apply(this)模拟空安全逻辑 - 注意不要在 lambda 中修改外部变量(保持无副作用)
它不是性能优化工具,只是让函数式风格更统一。简单转换(如 toLowerCase())直接调用原生方法更直观;复杂或可复用的逻辑才推荐用 transform 封装。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











