一、业务场景:
把前端传进来的VO跟需要数据处理的PO进行转换,或者调用的返回值需要调整个别属性值然后做进一步处理,下面的两种方法就是针对上述场景进行处理。
补充:日常开发中碰到新开发的服务模块调用既有服务时使用不同的对象时需要相互转换。
二、转换方法:
1. BeanUtils.copyProperties(source,target)
此方法是spring-framework为bean提供的包中唯一工具类。官方的文档说:此方法可以将源对象中的属性值复制给目的对象。源对象和目的对象均需要有相同的属性才能进行此操作,此方法适合的场景是两个对象具有相同的属性,需要将对象A拷贝给对象B。下面是一个例子:
import org.springframework.beans.BeanUtils;
void copyProperties(){
AgentIdsReq agentIdsReq = new AgentIdsReq();
SkillIdsReq skillIdsReq = new SkillIdsReq();
BeanUtils.copyProperties(agentIdsReq,skillIdsReq);
// continue to process
}
2. 函数式接口Function方法转换对象
对于有大量属性的对象转换问题,可以使用java的新特性,函数上接口处理。具体方式是:在需要转换的类后面增加一个私有Function方法,在具体转换中引用此方法。具体使用举例请参看下面的案例:
对象转换
1、构建私有方法:
private Function<order, orderInfo> getOrderInfo = order -> orderInfo.builder()
.callId(order.getCallId())
.orderNo(order.getOrderNo())
.treatmentDay(order.getTreatmentDay())
.build();
2、使用:
OrderInfo orderinfo = getOrderInfo.apply(order);
list转换
1、私有方法构建方法如下:
private Function<sourceOrderListItem, targetOrderInfo> getTargetOrderInfoFromSource = item -> {
return targetOrderInfo.builder()
.treatmentDay(item.getDutyDate())
.treatmentWeek(item.getWeekText())
.treatmentTime(item.getDutyCodeText())
.deliverName(item.getDeliverName())
.cardNo(item.getIdNo())
.phone(item.getMobileNo())
.createTime(DateUtil.parse(item.getCreateTime(), DateUtils.datetimeFormat))
.cancelTime(item.getCancelTime() != null ? DateUtil.parse(item.getCancelTime(), DateUtils.datetimeFormat) : null)
.cancelChannel(item.getCancelChannelText())
.build();
};
2、新建一个目标对象list:
List<targetOrderInfo> targetOrderInfos = new ArrayList<>();
3、转化语句:
targetOrderInfos.addAll(sourceOrderListItems.stream().map(item -> getTargetOrderInfoFromSource.apply(item)).toList());
三、后记:
本文章对高级的转换方法进行使用说明,如果时间紧、任务重,也可以力大砖飞,直接用最常用的getXXX()做转换。