我试图从Iterator对象中过滤特定元素,我可以通过iterator.remove()
方法删除虚假元素。
这是我的方法存根:
private static Iterator<A> process(Iterator<A> iter, Per p) {
while(iter.hasNext()){
A o = iter.next();
if(p.per(o)){
iter.remove();
}
}
return iter;
}
我可以删除不相关的元素,但是当我查看Iterator.reomve()的java api时,它会说:
void remove(): 从底层集合中移除迭代器返回的最后一个元素(可选操作)。每次调用next时,只能调用一次此方法。如果在迭代正在进行的过程中修改基础集合而不是通过调用此方法,则迭代器的行为是未指定的。
我只是想知道它为什么是可选操作?在使用remove()方法时让程序员更加小心是一个警告吗?还是有其他含义?
先谢谢你们的帮助。
我编写的整个代码在下面供您参考:
package com.test.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
final IteratorTest it = new IteratorTest();
List<A> list = new ArrayList<A>(){{
add(it.new A(10));
add(it.new A(11));
add(it.new A(12));
add(it.new A(13));
add(it.new A(16));
}};
Iterator<A> iter = list.iterator();
iter = process(iter, it.new Per());
System.out.println("");
}
private static Iterator<A> process(Iterator<A> iter, Per p) {
while(iter.hasNext()){
A o = iter.next();
if(p.per(o)){
iter.remove();
}
}
return iter;
}
class A{
private String name;
private int age;
public A(int i){
this.age = i;
this.name = i + ",wang";
}
}
class Per{
public boolean per(A a){
if(a.age % 2 == 0){
return true;
}else{
return false;
}
}
}
}
答案 0 :(得分:15)
这意味着根据API的合同,remove()
方法不需要在所有实现上实现/可用。这是因为在某些实现中,它可能没有意义 - 或者实现起来是不可行的。一个很好的例子是在只读集合上返回的迭代器 - 例如Collections.unmodifiableCollection()
返回的迭代器。
答案 1 :(得分:2)
这只是意味着Iterator
的实现是可选的。某些实现提供了支持它的功能,而其他实现可能会抛出UnsupportedOperationException
。在您的情况下,您使用的是支持该操作的Iterator
,所以没关系。