【高阶开发技巧】对象转化二三事

一、业务场景:

        把前端传进来的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()做转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java工程师k仔

感谢你的鼓励,我会再接再厉的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值