为什么我在Apex开发中使用的Map出现数据被覆盖的问题?
问题根因
你的代码核心问题是集合引用复用:
你在遍历Account的循环外提前初始化了accContacts列表,Apex中的集合属于引用类型,你调用accContacts.clear()、add()方法时都是修改同一块内存地址里的内容,每次map.put(ac.Id, accContacts)实际是把同一个列表的引用存到了Map的不同key下。
循环结束后,Map里所有key对应的都是同一个列表对象,内容自然是最后一次循环生成的Contact数据,这就是你看到所有Account都关联同一份Contact的原因。
修复方案
把accContacts的初始化逻辑移到遍历Account的循环内部,每次循环都生成一个全新的独立列表即可:
public static Map<Id, List<Contact>> createContacts(List<Account> accounts, Integer numOfContacts) { Map<Id, List<Contact>> mapOfAccountIdToListOfContacts = new Map<Id, List<Contact>>(); List<Contact> addedContacts = new List<Contact>(); for(Account ac :accounts) { // 每次处理新Account时新建独立的Contact列表,避免引用复用 List<Contact> accContacts = new List<Contact>(); for(Integer i=0;i<numOfContacts;i++) { Contact newContact = new Contact( LastName='TestContact' + i, Email = 'TestContact' + i + '@testco.com', AccountId = ac.Id ); accContacts.add(newContact); } mapOfAccountIdToListOfContacts.put(ac.Id, accContacts); System.debug('Map.put=' + ac.id + ', ' + accContacts); addedContacts.addAll(accContacts); } insert addedContacts; for(Id key :mapOfAccountIdToListOfContacts.keySet()) { System.debug('Contacts=' + mapOfAccountIdToListOfContacts.get(key)); } return mapOfAccountIdToListOfContacts; }
内容的提问来源于stack exchange,提问作者DanP
相关产品推荐
相关产品推荐

