课程章节介绍
好,同学们,咱们这节课来聊聊Apex里的集合,特别是你把sObject放进集合时,会有一个很有趣,但也很容易踩坑的地方。
你们应该都知道,集合(比如Set)就是用来存不重复元素的容器。可以存数字、字符串,也可以存sObject。但sObject这种“对象”怎么判断是不是重复呢?它不是看内存地址,而是直接比较你对象里的,字段值,。
比如说,你现在有一个Account的集合。你创建了两个Account对象,都只设置了Name为“张三”,其他字段都空着。你把这两个对象都加到集合里,结果集合里只会有,一个,“张三”的Account,因为它们的字段值是一样的,Set就认为它们是重复的。
但是,如果你给第二个Account多设置了一个字段,比如Description(描述),一个写“客户A”,一个写“客户B”。那这时候,虽然Name相同,但整个对象的值不一样了,Set就会认为这是两个不同的记录,,两个都会加进去,。
好,这一点明白了,咱们接着说个更“坑”的地方,也是官方文档特别警告的。
如果你把一个sObject对象加到集合里之后,,又去修改了这个对象的字段值,,那惨了,这个集合里就“找不到”它了。比如说,你有一个Account a,Name=“李四”,加进了Set。然后你代码里又写了一句 `a.Name = '王五';` 这时候你用 `set.contains(a)` 去判断,会返回false,因为集合是用字段值来记忆的,它里面存的是“李四”,没有“王五”,而你提供的a已经是“王五”了,所以找不到。哪怕这个对象就是原来放进去的那个对象,也没用。
这就像你把一张写有“苹果”的纸条放进一个盒子里,然后你偷偷把纸条上的字改成了“香蕉”。当你拿着这张纸问盒子:“你有没有我这张纸上的东西?”盒子一看,上面写的是“香蕉”,但它里面只记得有“苹果”,所以就说没有。
所以,在写代码的时候一定要注意:如果你把一个sObject放进Set或者Map的键里,最好就别再去改它的字段了。否则contains、containsAll这些方法会给你意想不到的结果,查个半天都找不出bug。
好了,这个知识点就讲这么多,大家记住了吗?集合检查唯一性是靠字段值,而且对象值一旦变了,在集合里就“隐形”了。下节课我们再讲其他细节。
关键词
Apex
Salesforce
Developer Guide