List<ScaleAndEnterpriseDTO> copyDtoList = new ArrayList<>(); dtoList.sort((o1, o2) -> o2.getCumulativeInvestmentMoney().compareTo(o1.getCumulativeInvestmentMoney())); for (int i = 0; i < dtoList.size(); i++) { ScaleAndEnterpriseDTO dto = dtoList.get(i); dto.setCumulativeNumber(i + 1); dto.setCumulativeProvinceName(getMonthLink(dto.getCumulativeProvinceNumber(), month, dto.getCumulativeProvinceName())); dto.setBalanceProvinceName(getMonthLink(dto.getBalanceProvinceNumber(), month, dto.getBalanceProvinceName())); dto.setCustomerProvinceName(getMonthLink(dto.getCustomerProvinceNumber(), month, dto.getCustomerProvinceName())); // 注意不能直接往copyDtoList.add(dto),因为这样会引用的同一个对象,在dtoList里面对这个dto做了修改,copyDtoList里面的这个dto也是同样被修改了 ScaleAndEnterpriseDTO copyDto = new ScaleAndEnterpriseDTO(); BeanUtil.copyProperties(dto, copyDto, false); copyDtoList.add(copyDto); } dtoList.sort((o1, o2) -> o2.getInvestmentBalance().compareTo(o1.getInvestmentBalance())); for (int i = 0; i < dtoList.size(); i++) { ScaleAndEnterpriseDTO copyDto = copyDtoList.get(i); ScaleAndEnterpriseDTO dto = dtoList.get(i); System.out.println(dto); copyDto.setBalanceNumber(i + 1); copyDto.setBalanceProvinceName(dto.getBalanceProvinceName()); copyDto.setBalanceGroup(dto.getBalanceGroup()); copyDto.setInvestmentBalance(dto.getInvestmentBalance()); copyDto.setBalanceProvinceNumber(dto.getBalanceProvinceNumber()); // System.out.println(copyDto); } dtoList.sort((o1, o2) -> Long.compare(o2.getCustomerPeopleNumber(), o1.getCustomerPeopleNumber())); for (int i = 0; i < dtoList.size(); i++) { ScaleAndEnterpriseDTO copyDto = copyDtoList.get(i); ScaleAndEnterpriseDTO dto = dtoList.get(i); copyDto.setCustomerGroup(dto.getCustomerGroup()); copyDto.setCustomerNumber(i + 1); copyDto.setCustomerProvinceName(dto.getCustomerProvinceName()); copyDto.setCustomerPeopleNumber(dto.getCustomerPeopleNumber()); copyDto.setCustomerProvinceNumber(dto.getCustomerProvinceNumber()); }
当时发现在dtoList第二次排序的时候,会出现属性重复的问题,然后debug发现这个问题之后,一直想不通为什么会这样。明明没有对dto做任何set,但是在dtoList的第二次排序之后循环到第二次,dto就会被改变。
今天突然想到之前有过一次这种写法:
List<DTO> copyDtoList = dtoList;
这个当时就注意到引用的问题,然后换成了
List<DTO> copyDtoList = new ArrayList<>(dtoList);