Lambda表达式可将脱敏逻辑封装为可配置、可复用的函数式接口Desensitizer,通过一行式Lambda实现手机号、身份证、邮箱等规则,并结合注解与规则映射实现自动脱敏。

可以用 Lambda 表达式把脱敏逻辑变成可配置、可复用的“行为单元”,而不是写死在业务代码里。核心思路是:定义统一的脱敏函数接口,用 Lambda 实现不同规则,再按字段类型或场景动态选择执行。
定义通用脱敏函数接口
先声明一个函数式接口,接收原始值,返回脱敏后结果:
Java@FunctionalInterface
public interface Desensitizer
String apply(T input);
}
这个接口就是 Lambda 的“容器”。只要满足输入类型、输出为 String,任何脱敏逻辑都能塞进去。
用 Lambda 封装常见脱敏规则
手机号、身份证、邮箱等规则各自写成一行 Lambda,清晰又隔离:
Java// 手机号:138****5678
Desensitizer
// 身份证:110**********2345
Desensitizer
? s.substring(0, 3) + "********" + s.substring(11)
: s;
// 邮箱:z***@xxx.com
Desensitizer
int at = s.indexOf('@');
if (at
String local = s.substring(0, at);
return local.charAt(0) + "***@" + s.substring(at + 1);
};
按业务上下文动态选择脱敏器
不硬编码调用哪个 Lambda,而是根据字段名、注解或配置来路由:
Java// 构建规则映射表
Map
"phone", phoneMask,
"idCard", idCardMask,
"email", emailMask
);
// 动态执行(例如从 DTO 字段名取规则)
String fieldName = "phone";
String rawValue = "13812345678";
String masked = desensitizers.getOrDefault(fieldName, s -> "***").apply(rawValue);
结合注解实现自动脱敏(进阶)
在实体字段上加自定义注解,运行时扫描并绑定对应 Lambda:
Java@Target({FIELD})
@Retention(RUNTIME)
public @interface Desensitize {
DesensitizeType value() default PHONE;
}
// 启动时注册规则
static final Map
PHONE, s -> s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2"),
ID_CARD, s -> s != null && s.length() > 14 ? s.substring(0,3)+"********"+s.substring(11) : s
);
这样,后续新增脱敏类型只需扩展枚举 + 一行 Lambda,无需改核心处理逻辑。










