当java.util.Iterator.remove()方法是'可选操作'时,它是什么意思?

时间:2011-12-07 03:14:54

标签: java iterator

我试图从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;
            }
        }
    }   

}

2 个答案:

答案 0 :(得分:15)

这意味着根据API的合同,remove()方法不需要在所有实现上实现/可用。这是因为在某些实现中,它可能没有意义 - 或者实现起来是不可行的。一个很好的例子是在只读集合上返回的迭代器 - 例如Collections.unmodifiableCollection()返回的迭代器。

答案 1 :(得分:2)

这只是意味着Iterator的实现是可选的。某些实现提供了支持它的功能,而其他实现可能会抛出UnsupportedOperationException。在您的情况下,您使用的是支持该操作的Iterator,所以没关系。