Apex里面的retainAll
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相关推荐
- PyTorch里面的torch.nn.Parameter()
在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...
- servlet里面的context,定义属性值的事情!
servlet里面的context,定义属性值. 在尚未指定属性值的时候.不管谁调用,都是NULL. 但是,一旦指定了属性值.那么,再次调用就是之间指定的数值啦! 而且,是象mapping一样存储对象 ...
- jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?...
jQuery里面的datepicker日期控件默认是显示英文的,如何让他显示中文或其他呢? [官方的写法]: (1)引入JS文件: <script type="text/javascr ...
- Angularjs $scope 里面的$apply 方法 和 $watch 方法
Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点: 1. Angularjs $scope 里面的$apply 方法 2. Angularjs $scope ...
- Android stdio build.gradle buildscript 里面的repositories 和allprojects里面 repositories 的区别
第一段 buildscript 里面的 repositories 表示只有编译工具才会用这个仓库. 比如 buildscript 里面的 dependencies classpath 'com.and ...
- JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...
- 对于C#里面的this与base
如果说你父类里面有一个成员比如int a;那么你子类里面也可以再定义一个int a,这个时候base.a和this.a表示的就不是一个变量了,如果说子类里面没有,那么base.a和this.a表示的都 ...
- 开启Windows8里面的Hyper-V虚拟机功能
首先了解下什么是Hyper-V?也就是虚拟化技术,允许终端用户在同一台机器上运行多个操作系统,支持32位和64位系统,可以直接在Windows 8上创建自己的虚拟机.开启Hyper-V虚拟机需要更多的 ...
- m_Orchestrate learning system---二十四、thinkphp里面的ajax如何使用
m_Orchestrate learning system---二十四.thinkphp里面的ajax如何使用 一.总结 一句话总结:其实ajax非常简单:前台要做的事情就是发送ajax请求过来,后台 ...
- C语言实现:输入一串字符把里面的A、a字符替换成C输出
C语言实现:输入一串字符把里面的A.a字符替换成C输出 #include "stdafx.h" #include<stdio.h> #include<string ...
最新文章
- vmware克隆server2008R2造成SID冲突
- 电源完整性仿真让电路板更完美
- Nginx读取Memcached实现页面内容缓存
- 【WebRTC---入门篇】(十三)WebRTC音视频数据采集
- 听小鹏讲废话之OSI
- python微软产品一般都一个25位的序列号_Python易错点6
- My first essay
- 屏幕画笔工具Pointofix,期货/股票复盘分析画线好工具
- 一文讲清楚【KL距离】、【torch.nn.functional.kl_div()】和【torch.nn.KLDivLoss()】的关系
- GeForce Experience 绕过登录与禁止自动更新
- Linux基础 - 服务管理(systemd)
- 2020东南大学网络空间安全复试经验分享
- 学生选课系统-学年学期选择器,根据入学年份自动计算当前学期
- Windows7安装IIS
- 聚划算的赢面不只是刘涛
- nsl0重构算法 matlab,基于SL0压缩感知信号重建的改进算法
- C语言入门 -- 数字的两种读法(2021/1/7)
- [BZOJ4899]记忆的轮廓
- SIMCOM7600CE TCP通信
- 昨天帮朋友转一个CAD文件
热门文章
- .NET环境下基于RBAC的访问控制
- 轻量级前端路由 router directorjs兼容ie8
- y470 bios uefi_AMD又能开核?刷完BIOS后性能白给,这次血赚了
- 2022-2027年中国办公设备租赁市场竞争态势及行业投资潜力预测报告
- 仿站小工具和小飞兔(扒取网站页面)
- 【Python】爬取并下载Instagram帖子的信息、图片和视频
- linux如何查看系统崩溃日志,Linux系统日志及日志分析
- 中文界面blend_使用Blend设计出符合效果的WPF界面
- 【统信UOS】扫描仪设备管理驱动安装
- AI发票扫描识别sdk软件接口