Java Collection接口removeIf方法源码疑问:为何用each.next()判断后删除
关于Collection.removeIf中Iterator用法的疑问解答
首先得明确两个核心问题:
- Iterator是遍历工具,不是集合元素:你写的
filter.test(each)是把迭代器对象本身传给了Predicate,但Predicate的泛型是<? super E>,它需要接收的是集合里的元素类型(E或其父类),而Iterator<E>和集合元素E是完全不同的类型,这行代码连编译都无法通过。 - Iterator的remove()有严格调用规则:迭代器的
remove()方法只能删除最近一次调用next()返回的元素。因为迭代器需要明确知道要删除哪个元素,必须先通过next()移动指针并获取当前元素,才能调用remove()完成删除操作。
再看源码的逻辑:
each.hasNext()判断是否还有未遍历的元素;each.next()获取当前遍历的元素,同时移动迭代器指针;- 把这个元素传给
filter.test()判断是否符合删除条件; - 如果符合,调用
each.remove()删除刚才next()拿到的那个元素,这完全符合Iterator的使用规范,能保证删除操作的正确性。
如果像你想的那样直接传迭代器给filter,不仅类型不匹配,而且filter根本无法判断集合元素的条件——我们要删除的是集合里的元素,不是判断迭代器对象是否满足条件,逻辑上完全偏离了需求。
内容的提问来源于stack exchange,提问作者xiunian
相关产品推荐
相关产品推荐

