如何实现将List<SObject>转为Map<SObjectField,SObject>并支持SObjectField入参
实现方案
原有代码问题梳理
- 方法内部重复声明了
listToConvert变量,直接覆盖了传入的参数,导致拿到的永远是空列表 - 标准
Map.putAll(List<SObject>)方法默认生成的是Map<Id, SObject>,和你需要的结构完全不匹配 - 缺少你要求的
SObjectField类型的入参
通用场景实现(字段值为Key)
绝大多数业务场景下你实际需要的是:将传入的SObjectField对应的字段值作为Map的Key,对应SObject记录作为Value,实现代码如下:
global with sharing class test1 { global Map<Object, SObject> convertMap(List<SObject> listToConvert, SObjectField keyField) { // 入参非空校验 if (listToConvert == null || keyField == null) { return new Map<Object, SObject>(); } Map<Object, SObject> resultMap = new Map<Object, SObject>(); for (SObject record : listToConvert) { // 取指定字段的值作为key Object keyValue = record.get(keyField); if (keyValue != null) { resultMap.put(keyValue, record); } } return resultMap; } }
注意:如果多条记录的指定字段值相同,后遍历到的记录会覆盖之前的记录
严格匹配你描述的结构实现(SObjectField为Key)
如果你确实需要Map<SObjectField, SObject>结构,实现如下,该场景下因为Key是你传入的固定SObjectField,Map中最终只会保留List的最后一条记录:
global with sharing class test1 { global Map<SObjectField, SObject> convertMap(List<SObject> listToConvert, SObjectField keyField) { if (listToConvert == null || keyField == null || listToConvert.isEmpty()) { return new Map<SObjectField, SObject>(); } Map<SObjectField, SObject> resultMap = new Map<SObjectField, SObject>(); // 仅保留最后一条记录映射到传入的字段 resultMap.put(keyField, listToConvert[listToConvert.size()-1]); return resultMap; } }
内容的提问来源于stack exchange,提问作者Giosuè Zocco
相关产品推荐
相关产品推荐

