最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java 中使用方法引用实现属性拷贝逻辑
时间:2026-07-11 09:21:46 编辑:袖梨 来源:一聚教程网
方法引用不能直接实现属性拷贝,仅能通过Function接口简化属性读取,需配合BiConsumer等完成“读-写”逻辑,适用于类型安全、无反射的轻量级字段映射。
Java 中方法引用本身不能直接实现属性拷贝,但它可以配合 java.util.function 中的函数式接口(如 Function)简化属性提取逻辑,在手动或自定义拷贝场景中提升可读性和复用性。
方法引用用于属性读取而非直接拷贝
属性拷贝本质是「读取源对象字段 → 写入目标对象字段」的过程。方法引用(如 Person::getName)只能表示一个无参、返回值为属性的函数(即 Function<person string></person>),它只解决「怎么读」,不涉及「怎么写」或「如何映射」。
- ✅ 正确用法:用
Function<S, T>表示从源类型S到目标类型T的属性访问路径 - ❌ 错误理解:以为写个
target.setName(source.getName())就能靠方法引用自动完成——这仍需显式调用 setter - 常见组合:
Function<User, String> nameGetter = User::getUsername;,后续可用于统一提取字段
结合 Lambda 构建简易字段映射器
你可以用方法引用 + Lambda 封装「读-写」逻辑,避免重复手写 getter/setter 调用:
- 定义映射规则:例如
(source, target) -> target.setName(source.getName()) - 用方法引用简化 getter 部分:
Function<User, String> getName = User::getUsername;,再配合 setter 的 Lambda 使用 - 实际示例:
Function<User, String> getName = User::getUsername;<br>BiConsumer<Admin, String> setName = Admin::setUsername;<br>setName.accept(target, getName.apply(source));
在自定义工具类中复用方法引用
若不想依赖第三方库(如 BeanUtils、MapStruct),可设计轻量级拷贝工具,将方法引用作为配置传入:
立即学习“Java免费学习笔记(深入)”;
- 定义字段映射对:如
new FieldMapping<>(User::getAge, Admin::setAge) - 工具方法接收多个
FieldMapping,遍历执行setter.accept(target, getter.apply(source)) - 优势:类型安全、编译期检查、无反射开销,且支持链式属性(如
user::getProfile::getPhone需封装为 Lambda,因方法引用不支持链式调用)
注意边界与限制
方法引用虽简洁,但有明确适用边界:
- 仅适用于 public getter/setter 且签名匹配;private 字段或 Lombok 生成的非标准方法无法直接引用
- 不处理类型转换(如
LocalDateTime→String),需额外包装或使用更通用的 converter - 不支持嵌套对象深拷贝或集合批量映射,这类逻辑仍需递归或流式处理
- 性能上优于反射,但比直接赋值略慢——不过多数业务场景差异可忽略