lambda表达式适合封装可变脱敏逻辑,通过函数式接口desensitizer统一建模,支持手机号、身份证号、邮箱等字段的内联策略,并可封装为通用工具方法或结合注解+反射实现自动脱敏。

Lambda表达式非常适合封装可变的、基于业务规则的脱敏逻辑——它把“怎么脱敏”这个行为变成数据,让调用方按需传入,既解耦又灵活。
明确脱敏接口:定义函数式接口
先设计一个清晰的脱敏行为契约。比如:
@FunctionalInterface
public interface Desensitizer<t> {
String apply(T input);
}</t>
这个接口只声明一个抽象方法 apply,符合函数式接口要求,能直接被 Lambda 实现。泛型 T 支持对手机号、身份证号、邮箱等不同类型输入统一建模。
你也可以复用 JDK 内置接口,如 Function
按规则编写具体脱敏逻辑
不同字段对应不同脱敏策略,用 Lambda 直接内联定义:
- 手机号:保留前3位和后4位,中间掩码
s -> s.substring(0, 3) + "****" + s.substring(7) - 身份证号:保留前6位和后4位
id -> id.substring(0, 6) + "********" + id.substring(14) - 邮箱:用户名部分只留首尾字符
email -> { int i = email.indexOf('@'); return email.charAt(0) + "***" + email.substring(i); }
这些 Lambda 不需要额外类或方法,写在哪用在哪,逻辑集中、修改方便。
封装为可复用工具方法
把脱敏动作包装成通用工具,接收原始值和脱敏策略:
public static <t> String desensitize(T value, Desensitizer<t> strategy) {
if (value == null) return null;
return strategy.apply(value);
}</t></t>
调用时只需传入值和对应 Lambda:
String maskedPhone = desensitize("13812345678", s -> s.substring(0, 3) + "****" + s.substring(7));
String maskedId = desensitize("11010119900307235X",
s -> s.substring(0, 6) + "********" + s.substring(14));
如果策略较多,可预定义静态常量或配置映射,避免重复写 Lambda:
public static final Desensitizer<string> PHONE = s -> s.substring(0, 3) + "****" + s.substring(7);
public static final Desensitizer<string> EMAIL = s -> {
int at = s.indexOf('@');
return at > 0 ? s.charAt(0) + "***" + s.substring(at) : s;
};</string></string>
结合实体字段做自动脱敏(进阶)
若需在 DTO 或 VO 层统一处理,可配合注解 + 反射 + Lambda:
- 定义 @Desensitize(rule = PHONE) 注解
- 维护一个 Map
> 映射表,key 是枚举 rule,value 是预设 Lambda - 序列化前遍历字段,命中注解则执行对应 Lambda 脱敏
这样业务代码完全无感,脱敏逻辑集中在配置和工具层,新增规则只需加一条 Lambda 和一个枚举项。










