Apex里面的retainAll

学习目的
1,掌握集合retainAll的用法
2,避免幽灵bug

集合retainAll的用法

1,Boolean retainAll(List/Set)
该方法的作用相信很多人会认为是两个集合取交集。那真的是这样吗?在揭晓谜底之前,先来几道题目。

Set<String> cmpPartnerTypeSet = new Set<String>{'A','B'};
Set<String> cmpincentivePagramSet = new Set<String>{'A','B'};
System.debug('===='+cmpPartnerTypeSet.retainAll(cmpincentivePagramSet));

输出:false


这个时候肯定心里会说上一句:Fuck!预期的true呢?
那再来一道题目:

Set<String> cmpPartnerTypeSet = new Set<String>{'A','B'};
Set<String> cmpincentivePagramSet = new Set<String>{'B'};
System.debug('===='+cmpPartnerTypeSet.retainAll(cmpincentivePagramSet));

输出:true

好像又对了,有交集返回true。没毛病。
这个时候开始质疑,我擦擦,是不是编译器坏了啊。玩我啊!
再来一道,试试:

Set<String> cmpPartnerTypeSet = new Set<String>{'A','B'};
Set<String> cmpincentivePagramSet = new Set<String>{'A','B','C'};
System.debug('===='+cmpPartnerTypeSet.retainAll(cmpincentivePagramSet));

输出:false

这~~~~~,玩我啊!
别急,我们继续玩:

Set<String> cmpPartnerTypeSet = new Set<String>{'A','B'};
Set<String> cmpincentivePagramSet = new Set<String>{'D','B','C'};
System.debug('===='+cmpPartnerTypeSet.retainAll(cmpincentivePagramSet));

输出:true

到这里有没有发现一个问题,就是他丫的根本不是一个正宗的取交集的函数。现在我们去看看它的真面目:

public boolean retainAll(Collection<?> c) {//调用自己的私有方法return batchRemove(c, true);}
//集合A比较与集合B的交集private boolean batchRemove(Collection<?> c, boolean complement) {//获得当前对象的所有元素final Object[] elementData = this.elementData;//w:标记两个集合公共元素的个数int r = 0, w = 0;//设置标志位boolean modified = false;try {//遍历集合Afor (; r < size; r++)//判断集合B中是否包含集合A中的当前元素if (c.contains(elementData[r]) == complement)//如果包含则直接保存。elementData[w++] = elementData[r];} finally {// 如果 c.contains() 抛出异常if (r != size) {//复制剩余的元素System.arraycopy(elementData, r,elementData, w,size - r);//w为当前集合A的lengthw += size - r;}//如果集合A的大小放生改变if (w != size) {// 清除工作for (int i = w; i < size; i++)elementData[i] = null;//记录集合中元素的改变(add/remove)modCount += size - w;//设置当前数组的大小size = w;//返回为truemodified = true;}}return modified;}

看到这里就明白了,这丫的原来就不能直接用来判断是否有交集。我们通过上面发现,当A.retainAll(B) 时,A集合发生改变的时候,返回的就是true,而A没有发生改变,结果就是false。

不过retainAll确实可以用来判断两个集合是不是有交集。使用方法如下:

Set<String> A= new Set<String>{'A','B'};
Set<String> B= new Set<String>{'D','B','C'};
A.retainAll(B);//来一发
if(A.size() > 0){System.debug("这两个集合有交集");
}else{System.debug("这两个集合没交集");
}
//取得交集
Set<String> cmpPartnerTypeSet = new Set<String>{'B'};
Set<String> cmpincentivePagramSet = new Set<String>{'A'};
cmpPartnerTypeSet.retainAll(cmpincentivePagramSet);
System.debug('===='+cmpPartnerTypeSet.size());
for (String  s: cmpPartnerTypeSet) {System.debug('======='+s);
}

好了,这个是今天在写代码碰见的一个bug。足以说明,基础真的很重要。如果有描述不对的,希望各位指出,一起学习,一起进步!

Apex里面的retainAll相关推荐

  1. PyTorch里面的torch.nn.Parameter()

    在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...

  2. servlet里面的context,定义属性值的事情!

    servlet里面的context,定义属性值. 在尚未指定属性值的时候.不管谁调用,都是NULL. 但是,一旦指定了属性值.那么,再次调用就是之间指定的数值啦! 而且,是象mapping一样存储对象 ...

  3. jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?...

    jQuery里面的datepicker日期控件默认是显示英文的,如何让他显示中文或其他呢? [官方的写法]: (1)引入JS文件: <script type="text/javascr ...

  4. Angularjs $scope 里面的$apply 方法 和 $watch 方法

    Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点: 1. Angularjs $scope 里面的$apply 方法 2. Angularjs $scope ...

  5. Android stdio build.gradle buildscript 里面的repositories 和allprojects里面 repositories 的区别

    第一段 buildscript 里面的 repositories 表示只有编译工具才会用这个仓库. 比如 buildscript 里面的 dependencies classpath 'com.and ...

  6. JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...

  7. 对于C#里面的this与base

    如果说你父类里面有一个成员比如int a;那么你子类里面也可以再定义一个int a,这个时候base.a和this.a表示的就不是一个变量了,如果说子类里面没有,那么base.a和this.a表示的都 ...

  8. 开启Windows8里面的Hyper-V虚拟机功能

    首先了解下什么是Hyper-V?也就是虚拟化技术,允许终端用户在同一台机器上运行多个操作系统,支持32位和64位系统,可以直接在Windows 8上创建自己的虚拟机.开启Hyper-V虚拟机需要更多的 ...

  9. m_Orchestrate learning system---二十四、thinkphp里面的ajax如何使用

    m_Orchestrate learning system---二十四.thinkphp里面的ajax如何使用 一.总结 一句话总结:其实ajax非常简单:前台要做的事情就是发送ajax请求过来,后台 ...

  10. C语言实现:输入一串字符把里面的A、a字符替换成C输出

    C语言实现:输入一串字符把里面的A.a字符替换成C输出 #include "stdafx.h" #include<stdio.h> #include<string ...

最新文章

  1. vmware克隆server2008R2造成SID冲突
  2. 电源完整性仿真让电路板更完美
  3. Nginx读取Memcached实现页面内容缓存
  4. 【WebRTC---入门篇】(十三)WebRTC音视频数据采集
  5. 听小鹏讲废话之OSI
  6. python微软产品一般都一个25位的序列号_Python易错点6
  7. My first essay
  8. 屏幕画笔工具Pointofix,期货/股票复盘分析画线好工具
  9. 一文讲清楚【KL距离】、【torch.nn.functional.kl_div()】和【torch.nn.KLDivLoss()】的关系
  10. GeForce Experience 绕过登录与禁止自动更新
  11. Linux基础 - 服务管理(systemd)
  12. 2020东南大学网络空间安全复试经验分享
  13. 学生选课系统-学年学期选择器,根据入学年份自动计算当前学期
  14. Windows7安装IIS
  15. 聚划算的赢面不只是刘涛
  16. nsl0重构算法 matlab,基于SL0压缩感知信号重建的改进算法
  17. C语言入门 -- 数字的两种读法(2021/1/7)
  18. [BZOJ4899]记忆的轮廓
  19. SIMCOM7600CE TCP通信
  20. 昨天帮朋友转一个CAD文件

热门文章

  1. .NET环境下基于RBAC的访问控制
  2. 轻量级前端路由 router directorjs兼容ie8
  3. y470 bios uefi_AMD又能开核?刷完BIOS后性能白给,这次血赚了
  4. 2022-2027年中国办公设备租赁市场竞争态势及行业投资潜力预测报告
  5. 仿站小工具和小飞兔(扒取网站页面)
  6. 【Python】爬取并下载Instagram帖子的信息、图片和视频
  7. linux如何查看系统崩溃日志,Linux系统日志及日志分析
  8. 中文界面blend_使用Blend设计出符合效果的WPF界面
  9. 【统信UOS】扫描仪设备管理驱动安装
  10. AI发票扫描识别sdk软件接口