课程章节介绍
同学们,我们继续来看这一页幻灯片,讲的是 Apex 里 Map 集合的一个很实用的特性。
映射,也就是 Map,它的键和值可以是任何数据类型,甚至可以是 sObject 类型。那这有什么好处呢?一个特别常见的场景,就是用来实现两个表在内存里的“连接”。比如我们有一个联系人的列表,每个联系人都关联了一个客户 ID。如果我们想在不反复查询数据库的情况下,快速根据客户 ID 拿到完整的客户记录,就可以先把所有相关的 Account 查出来,塞进一个 Map 里。然后遍历联系人时,用联系人的 AccountId 直接从 Map 里取 Account,这就相当于在内存里做了一个表连接。
那怎么高效地构建这样的 Map 呢?你可以直接在 SOQL 查询的时候,利用查询结果来自动填充 Map。写法很简单:你写一个 SOQL 查询,把返回的 List 直接传给 Map 的构造方法。但是要注意一点:这时 Map 的键类型必须是 ID 或者 String,值类型必须是 sObject。比如,我们可以这样写:
Map accMap = new Map([SELECT Id, Name FROM Account]);
这里 new 运算符拿到的就是查询返回的 Account 列表,它会自动把每条记录的 Id 作为键,把整个 sObject 作为值,放进 Map 里。是不是很方便?这样你就不用自己手动写循环去 put 了。
最后,幻灯片底下还有一个特别提醒,跟咱们在多社区环境里查询用户记录有关。如果你用的是 Experience Cloud 站点,以前叫社区,你会发现,当一个用户同时属于多个社区网络时,某些自动检索操作可能会返回重复的用户 ID。比如说,通过 Apex 去拿“最近查看的社区成员”这种列表,因为同一个用户在不同的网络里可能被视为不同的记录,导致出现相同的 ID。那如果你试图把这个列表直接塞进一个以 ID 为键的 Map,就会因为键重复而报错。所以遇到这种情况,你需要额外的去重处理,不能直接依赖 Map 的自动构造。
好,这一页我们就讲到这里。记住:用 SOQL 结果直接构建 ID 到 sObject 的 Map 是非常高效的内存连接手段,但要留意键的唯一性,尤其是在多网络环境下处理用户记录的时候。
关键词
Apex
Salesforce
Developer Guide