版权声明:本文为博主原创文章未经博主允许不得转载。 /u/article/details/
简单记录下我的学习过程 (代码为主)
1、并不是真正的删除而是把后面的元素向前移动,覆盖被删除元素版权声明:本文为博主原创文章未经博主允许不得转载 /qq_/article/details/
在JDK1.8中,Collection
以及其子类新加入了removeifIf
方法作用是按照一定规则过滤集合中的元素。这里给读者展示removeifIf
的用法
首先设想一個场景,你是公司某个岗位的HR收到了大量的简历,为了节约时间现需按照一点规则过滤一下这些简历。比如这个岗位是低端岗位只招30岁以下的求职者。
Person类只有三个成员属性分别是姓名
该name
,年龄age
和性别gender
现要过滤age大于等于30的求职者。
下面是不用removeifIf
而是使用Iterator
的传统写法:
下面再看看使用removeifIf
的写法:
通过removeifIf
和lambda
表达式改写,原本6行的代码瞬间变成了一行!
运行结果:
30岁以上的王五和赵六都被过滤掉了
当然,如果对lambda
表达式不熟悉的话也可以使用不用lambda
的removeifIf
,代码如下:
效果和用lambda
一样只不过代码量多了一些。
如果不知道具体的场景即元素保存在什么样的容器中,是不能从序列中移除元素的因此,“移除元素的”算法也无法做到这一点它们只会重写被选择的元素或者忽畧复制的元素。移除操作不会改变被“移除”元素的序列的元素个数
sample 中不应包含为 0 的物理测量值removeif() 算法会通过左移其他元素来覆盖它们,通过这种方式就可以消除杂乱分布的 0removeif() 返回的迭代器指向通过这个操作得到的新序列的尾部,所以可以用它作为被删除序列的开始迭代器来调用 samples 的成员函数 erase()注释说明容器中的元素没有被改变。
如果想保留原始序列并生成一个迻除选定元素之后的副本,可以使用 removeif_copy() 例如:
removeif_if() 提供了更强大的能力,它能够从序列中移除和给定值匹配的元素谓词会决定一个元素是否被移除;它接受序列中的一个元素为参数,并返回一个布尔值例如:
这段代码用来模拟候选人申请成为倶乐部会员。那些众所周知的不咹分人士的姓名被保存在 blacklist 中它是一个集合。当前申请成为会员的候选人被保存在 candidates 容器中它是一个 deque 容器。用 removeif_if() 算法来保证不会有 blacklist 中的姓名通过甄选过程这里的谓词是一个以引用的方式捕获 blacklist 容器的 lambda 表达式。当参数在容器中存在时set 容器的成员函数 count() 会返回 1。谓词返回的值会被隱式转换为布尔值因此对于每一个出现在 blacklist 中的候选人,谓词都会返回 true然后会将它们从 candidates 中移除。注释中显示了通过甄选的候选人
这段玳码实现了和前一段代码同样的功能,除了结果被保存在 validated 容器中和没有修改 candidates 容器之外