java不同对象的集合拷贝_优雅的拷贝不同层的对象(VO,DO等)

编写代码时,因为分层,所以经常需要VO,DO甚至DTO等层对象进行拷贝,DO是数据库对象,VO是要展示到前端的对象,其实Spring提供的BeanUtils拷贝一般对象够了,但是对于List支持还没有,所以自己稍微对于BeanUtils扩展一下,并且对于拷贝对象添加回调方法,便于不同层转换时及时修改一些有差异的字段。

使用方法

public class TestCopyProperty {

public static void main(String[] args) {

UserDO userDO = new UserDO();

userDO.setUsername("username1");

userDO.setEmail("asd@asd.com");

UserVO userVO = BeanCopyUtil.copyProperties(userDO, UserVO::new, (udo, uvo) -> {

//回调修改vo的role字段

uvo.setRole("role");

});

System.out.println(userVO);

UserVO userVO1 = BeanCopyUtil.copyProperties(userDO, UserVO::new);

System.out.println(userVO1);

List userList = Collections.singletonList(userDO);

List userVOList = BeanCopyUtil.copyListProperties(userList, UserVO::new, (udo, uvo) -> {

//回调修改vo的role字段

uvo.setRole("role list");

});

System.out.println(userVOList);

List userVOList1 = BeanCopyUtil.copyListProperties(userList, UserVO::new);

System.out.println(userVOList1);

}

}

//Output

UserVO(username=username1, password=null, email=asd@asd.com, role=role, roleName=)

UserVO(username=username1, password=null, email=asd@asd.com, role=null, roleName=)

[UserVO(username=username1, password=null, email=asd@asd.com, role=role list, roleName=)]

[UserVO(username=username1, password=null, email=asd@asd.com, role=null, roleName=)]

实际场景

比如实际使用时,对于分页数据从DO集合转换到VO集合,同时修改VO其中字段

default PageResult> page(QueryBase queryBase, ProjectRepository projectRepository) {

Pageable pageable = PageRequest.of(queryBase.getJpaPageIndex(), queryBase.getPageSize(), queryBase.getSort());

Page pageResult = findAll(pageable);

List result = BeanCopyUtil.copyListProperties(pageResult.getContent(), TaskVO::new, (taskDO, taskVO) -> {

String projectName = projectRepository.findById(taskDO.getProjectId()).map(ProjectDO::getName).orElse("");

taskVO.setProjectName(projectName);

});

return PageResult.build(result).setRecordsTotal(pageResult.getTotalElements());

}

回调接口

BeanCopyUtilCallBack

@FunctionalInterface

public interface BeanCopyUtilCallBack {

/**

* 定义默认回调方法

* @param source 源数据

* @param target 目标数据

*/

void callBack(S source, T target);

}

Bean拷贝工具类代码

BeanCopyUtil

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;

import java.util.List;

import java.util.function.Supplier;

/**

* Bean拷贝工具类

*

* @author LoneKing

* @date 2020/10/22

*/

public class BeanCopyUtil extends BeanUtils {

/**

* 对象数据的拷贝

*

* @param source 数据源

* @param target 目标类::new(eg: UserVO::new)

* @param callBack 回调

* @param 源数据类型

* @param 目标数据类型

* @return 目标数据

*/

public static T copyProperties(S source, Supplier target, BeanCopyUtilCallBack callBack) {

T t = target.get();

copyProperties(source, t);

if (callBack != null) {

// 回调

callBack.callBack(source, t);

}

return t;

}

/**

* 对象数据的拷贝

*

* @param source 数据源

* @param target 目标类::new(eg: UserVO::new)

* @param 源数据类型

* @param 目标数据类型

* @return 目标数据

*/

public static T copyProperties(S source, Supplier target) {

return copyProperties(source, target, (BeanCopyUtilCallBack) null);

}

/**

* 集合数据的拷贝

*

* @param sources: 数据源

* @param target: 目标类::new(eg: UserVO::new)

* @param 源数据类型

* @param 目标数据类型

* @return List

*/

public static List copyListProperties(List sources, Supplier target) {

return copyListProperties(sources, target, null);

}

/**

* 带回调函数的集合数据的拷贝(可自定义字段拷贝规则)

*

* @param sources: 数据源

* @param target: 目标类::new(eg: UserVO::new)

* @param callBack: 回调函数

* @param 源数据类型

* @param 目标数据类型

* @return List

*/

public static List copyListProperties(List sources, Supplier target, BeanCopyUtilCallBack callBack) {

List list = new ArrayList<>(sources.size());

for (S source : sources) {

T t = target.get();

copyProperties(source, t);

if (callBack != null) {

// 回调

callBack.callBack(source, t);

}

list.add(t);

}

return list;

}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值