记录List赋值到新List时,对象值改变,新List内值也改变处理方法

问题产生

    在项目开发中,有一次的业务需求是需要对订单列表中信息进行处理,同时保留原订单信息列表,简单直接上手撸,在对原订单List<Order>中值进行操作时,最后发现复制出来的List内的对象值也同时改变。第一次写的代码如下

Map<String,Object> resMap = new HashMap<>();
List<Order> orderList = getOrder(queryDto);
// 记录原单据
List<Order> orginalOrderList = new LinkedList<>();
orginalOrderList.addAll(orderList);
// 保存原单据
resMap.put("orginalOrderList",orginalOrderList);

// orderList.foreach(order -> {
       // 模拟业务处理
        order.setBillingNo(billingNo);
        ...
   });

// 保存处理后单据
resMap.put("orderList",orderList); 

在处理完业务后,发现保存的原单据内的值也同时改变了,和新单据一致,后来改成了将原单据List 定义为final类型的,但是还是不起效果,后来才想起来,List中值为对象,并非基础数据类型,这些对象对应的内存中地址是一致的,单据改变后,内存地址并没有改变,所以导致保存的原单据值也是同样改变了,后来查询了下,找到了解决方案,使用BeanUtils.clonebean(Object object) ,解决了该问题

解决方案

修改后代码如下

Map<String,Object> resMap = new HashMap<>();
List<Order> orderList = getOrder(queryDto);
// 记录原单据
List<Order> orginalOrderList = new LinkedList<>();


// orderList.foreach(order -> {
        // 主要解决代码
        orginalOrderList.add((Order)BeanUtils.cloneBean(order));

       // 模拟业务处理
        order.setBillingNo(billingNo);
        ...
   });

// 保存原单据
resMap.put("orginalOrderList",orginalOrderList);
// 保存处理后单据
resMap.put("orderList",orderList); 

记录下解决问题的方案,方便以后能用到,如果能够对你也有所帮助,那是更好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值