Lambda表达式封装API参数脱敏逻辑的核心是将脱敏行为抽象为类型安全、可传递复用的函数接口Desensitizer,通过Map映射字段与Lambda实现解耦,支持Stream链式处理及注解驱动的自动脱敏。

用Lambda表达式封装API参数脱敏逻辑,核心是把“脱敏行为”变成可传递、可复用、类型安全的函数,而不是硬编码在业务方法里。关键不在于写多复杂的脱敏算法,而在于让脱敏规则与数据对象解耦,且支持按字段灵活配置。
定义脱敏策略函数式接口
先自定义一个函数式接口,明确语义:接收原始值,返回脱敏后值。加@FunctionalInterface确保编译期校验:
@FunctionalInterface
public interface Desensitizer<T> {
T apply(T raw);
}这样就支持任意类型(String、Phone、IDCard等)的脱敏实现,比如:
-
手机号脱敏:
s -> s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2") -
邮箱脱敏:
email -> email.replaceFirst("@", "****@") -
姓名脱敏:
name -> name.length() > 1 ? name.charAt(0) + "*" : name
用Lambda绑定字段与脱敏行为
避免在Controller或DTO里写if-else判断字段名再调用不同脱敏方法。推荐方式是用Map或注解+反射提前注册字段到Desensitizer的映射关系:
Map<String, Desensitizer<Object>> desensitizeRules = new HashMap<>();
desensitizeRules.put("phone", (String s) -> s.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2"));
desensitizeRules.put("email", (String s) -> s.replaceFirst("@", "****@"));后续对请求参数做遍历时,直接desensitizeRules.get(fieldName).apply(value)即可——行为由Lambda提供,字段由key驱动,完全声明式。
结合Stream和方法引用统一处理参数集合
当API接收的是List或嵌套对象时,用Stream链式调用配合Lambda,让脱敏成为数据流的一环:
List<UserRequest> requests = ...;
List<UserRequest> safeRequests = requests.stream()
.map(user -> {
user.setPhone(phoneDesensitizer.apply(user.getPhone()));
user.setEmail(emailDesensitizer.apply(user.getEmail()));
return user;
})
.collect(Collectors.toList());更进一步,可封装为通用工具方法,接受对象和字段提取器(也是Lambda):
<T> List<T> desensitize(List<T> list,
Function<T, String> phoneGetter,
Desensitizer<String> phoneHandler,
Function<T, String> emailGetter,
Desensitizer<String> emailHandler) {
return list.stream().map(item -> {
// 使用方法引用或Lambda修改字段
try {
Field phoneField = item.getClass().getDeclaredField("phone");
phoneField.setAccessible(true);
phoneField.set(item, phoneHandler.apply(phoneGetter.apply(item)));
} catch (Exception e) { /* 忽略或记录 */ }
return item;
}).collect(Collectors.toList());
}在DTO层用注解+Lambda驱动自动脱敏(进阶)
类似MyBatis-Plus的LambdaQueryWrapper思路,可定义@Desensitize(by = PhoneDesensitizer.class),并在序列化前通过SFunction<User, String>定位字段,再触发对应Lambda执行脱敏。此时Lambda不再是匿名写法,而是封装在工具类中供注解解析器调用,兼顾可读性与可维护性。

















