当前位置:   article > 正文

记录List赋值到新List时,对象值改变,新List内值也改变处理方法_list addall 的时候list变动问题

list addall 的时候list变动问题

问题产生

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

  1. Map<String,Object> resMap = new HashMap<>();
  2. List<Order> orderList = getOrder(queryDto);
  3. // 记录原单据
  4. List<Order> orginalOrderList = new LinkedList<>();
  5. orginalOrderList.addAll(orderList);
  6. // 保存原单据
  7. resMap.put("orginalOrderList",orginalOrderList);
  8. // orderList.foreach(order -> {
  9. // 模拟业务处理
  10. order.setBillingNo(billingNo);
  11. ...
  12. });
  13. // 保存处理后单据
  14. resMap.put("orderList",orderList);

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

解决方案

修改后代码如下

  1. Map<String,Object> resMap = new HashMap<>();
  2. List<Order> orderList = getOrder(queryDto);
  3. // 记录原单据
  4. List<Order> orginalOrderList = new LinkedList<>();
  5. // orderList.foreach(order -> {
  6. // 主要解决代码
  7. orginalOrderList.add((Order)BeanUtils.cloneBean(order));
  8. // 模拟业务处理
  9. order.setBillingNo(billingNo);
  10. ...
  11. });
  12. // 保存原单据
  13. resMap.put("orginalOrderList",orginalOrderList);
  14. // 保存处理后单据
  15. resMap.put("orderList",orderList);

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/77377
推荐阅读
相关标签
  

闽ICP备14008679号