写一个基于lambda的copyProperties

简介: 写一个基于lambda的copyProperties

和任何人都认朋友,结果和任何人都交不成朋友。——佚名

代码仓库:

https://gitee.com/dromara/stream-query

相关提交:

https://gitee.com/dromara/stream-query/commit/31114dbc1374f78aad17daa4da615766d93194a2

使用方式:

@Test
void testCopyProperties() {
  LambdaExecutable source =
      LambdaHelper.resolve(
          (Serializable & Function<LambdaExecutable, String>) LambdaExecutable::getName);
  LambdaExecutable target = BeanHelper.copyProperties(source, null);
  Assertions.assertNotNull(target);
  Assertions.assertEquals(source.getName(), target.getName());
}

此处targetnull会自动创建,只能copy到同类型,后续会支持不同类型的,尽请期待

目前的源码:

/**
 * 拷贝属性
 *
 * @param source 源对象
 * @param target 目标对象
 * @param <T> 对象类型
 */
public static <T> T copyProperties(T source, T target) {
  if (Objects.isNull(source)) {
    return target;
  }
  Class<T> clazz = SerFunc.<Class<?>, Class<T>>cast().apply(source.getClass());
  AtomicReference<T> targetRef = new AtomicReference<>(target);
  if (Objects.isNull(targetRef.get())) {
    SerFunc<Class<T>, Constructor<T>> getConstructor = Class::getConstructor;
    Constructor<T> constructor = getConstructor.andThen(ReflectHelper::accessible).apply(clazz);
    SerFunc<Constructor<T>, T> newInstance = Constructor::newInstance;
    targetRef.set(newInstance.apply(constructor));
  }
  Map<SerFunc<T, Object>, SerBiCons<T, Object>> getterSetterMap =
      LambdaHelper.getGetterSetterMap(clazz);
  getterSetterMap.forEach(
      (getter, setter) -> setter.accept(targetRef.get(), getter.apply(source)));
  return targetRef.get();
}
相关文章
|
11月前
|
存储 算法 安全
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
678 1
|
消息中间件 物联网 网络性能优化
MQTT常见问题之MQTT的topic超出上限25个如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
Java 程序员 容器
十分钟搞懂依赖注入
依赖注入(DI)是软件开发中的关键技术,它将类的依赖关系转移至外部管理,提升了代码的模块化和可测试性。如同炒菜时调料不由厨师直接添加,而是由调料师准备并递送,程序员只需声明所需依赖,外部机制如DI容器会负责实例化并注入这些依赖。这样,类变得更灵活且易于测试,同时也促进了代码的模块化。例如,在Java中,可以通过构造函数注入Logger接口的不同实现(如ConsoleLogger和FileLogger),使Application类与其具体实现解耦。
414 1
|
缓存 Java 程序员
Java内存模型深度解析:可见性、有序性和原子性
在多线程编程中,正确理解Java内存模型对于编写高效且无bug的并行程序至关重要。本文将深入探讨JMM的三大核心特性:可见性、有序性和原子性,并结合实例分析如何利用这些特性来避免常见的并发问题。
179 1
|
数据挖掘
深入解析ERP系统的人力资源管理模块
深入解析ERP系统的人力资源管理模块
553 1
|
人工智能
AI绘画提示词案例(宠物
AI绘画提示词案例(宠物
832 0
|
供应链
WMS的移动解决应用方案
WMS系统中的移送扫码应用,不仅提供了便捷性和灵活性,还能大大改善仓库管理的效率和准确性,从而提高客户满意度和企业运营的效益。
296 0
|
存储 索引 Python
上手Python之元组
上手Python之元组
上手Python之元组
Java 最常见的面试题:synchronized 和 Lock 有什么区别?
Java 最常见的面试题:synchronized 和 Lock 有什么区别?
|
Kubernetes Linux 网络安全
Netfilter和iptables介绍
在开始Kubernetes的网络之前我们先来学习Netfilter,Netfilter可能了解的人比较少,但是iptables用过 Linux的都应该知道。本文主要介绍Netfilter与iptables的原理。
下一篇
开通oss服务