梦回苍石居  |
Cangshi Live

关于Apex 中 Set 去重的 Issue - Summer 20

SALESFORCEAPEX
苍石 发表于:2019-07-09 15:15:35  最后编辑于:1 个月前 36 Views

关于Apex 中 Set 去重的 Issue - Spring 19

问题描述

使用 Apex 中的 Set 时,添加一个相同地址的对象时,无论添加多少次理应只有一个对象存在。
但在实际操作中,如果在每次添加前改动对象的一些属性,这次添加后的 Set 在未访问的情况下,同时存在该对象的多个元素,和 List 一样。
但如果你访问了该 Set ,其包含的元素就会被去重,

示例

Set<Account> accounts = new Set<Account>();
Account account = new Account(Name = 'Test Account');

accounts.add(account);

// First changed
account.Phone = '100001';
accounts.add(account);

// The second time changed
account.Phone = '100002';
accounts.add(account);

// System.debug(timeCards); // If there is no comment, the next line output of the set is: 1
// In the case of comments on the previous line, the output is: 3
System.debug(accounts.size()); 
// In this case, the annotated case is a list containing three elements, and the uncommented case is a list containing one element
System.debug(new List<Account>(accounts)); 

解决方案

  1. 使用额外的一层 Set 对该当前 Set 进行包装
    Set<Account> finalSet = new Set<Account>(accounts);
    
  2. 在新的 Set 中 addAll 该 Set
    Set<Account> finalSet = new Set<Account>();
    finalSet.addAll(accounts);
    

可能导致的原因

  • 在我看来,因为 Apex 的底层是通过 Java 实现的,所以其 Set 和 List 都是实现了 Iterator 接口,使用了相似的底层逻辑,为了性能的优化,Set 中的去重的步骤放到了 Set 被读取前,所以在以上代码中,被注释的代码就起到了读取 Set 的作用,并且去重。

文章评论 ( 0 )

Person name
未登录用户可以发表匿名评论