这个方法不是唯一的方法,其实最简单的方法就是我在第二个for循环里面重新new一个vmNew对象,然后通过set和get方法将vm对象的值一个一个的set到vmNew里面,但是由于我们这个vm对象里面几十个字段,一个一个写麻烦,而且我今天较真了,所以有了以下的方式,随笔记录,希望对大家有帮助!!!
对象vm将重新set对象值后重新add到list里面,覆盖前面add的值,一下方法是实现了不覆盖原来的值的方案,如下代码所示:
List<JSONObject> newList = new ArrayList<JSONObject>();
if(vms!=null && vms.size()>0) {
for(VirtualMachine vm : vms) {
if(InitInfo.vmDiskMap.containsKey(vcIp+"_"+vm.getVmId())) {
List<VirtualMachineDisk> diskList = InitInfo.vmDiskMap.get(vcIp+"_"+vm.getVmId());
if(diskList!=null && diskList.size()>0) {
for(VirtualMachineDisk disk : diskList) {
VirtualMachine vm1 = new VirtualMachine();
vm1.setLunId(disk.getLunId());
vm1.setLunName(disk.getStoreName());
vm1.setLunSize(disk.getDiskSize());
newList.add(vm1);
}
}
}
}
}
以上是会覆盖原有对象的代码,即使重新new了对象,也会覆盖掉,原因就是对象使用=号赋值,是将内存的索引给了新的对象,其实内存位置没变,还是指向原来的对象。
以下是我通过alibaba的JSONObject来进行对象类型转换的方式实现不覆盖原有对象内容。
List<JSONObject> newList = new ArrayList<JSONObject>();
if(vms!=null && vms.size()>0) {
for(VirtualMachine vm : vms) {
if(InitInfo.vmDiskMap.containsKey(vcIp+"_"+vm.getVmId())) {
List<VirtualMachineDisk> diskList = InitInfo.vmDiskMap.get(vcIp+"_"+vm.getVmId());
if(diskList!=null && diskList.size()>0) {
for(VirtualMachineDisk disk : diskList) {
vm.setLunId(disk.getLunId());
vm.setLunName(disk.getStoreName());
vm.setLunSize(disk.getDiskSize());
newList.add((JSONObject) JSONObject.toJSON(vm));
}
}
}
}
}
List<VirtualMachine> list = new ArrayList<VirtualMachine>();
for(JSONObject obj : newList) {
list.add(JSONObject.toJavaObject(obj, VirtualMachine.class));
}
请忽略代码中间一些无用的代码,那些是项目所需的业务逻辑,我懒得写demo了,直接上工程源码片段。
每天进步一点点,坚持带来大改变。