2011-12-07 33 views
7

我试图过滤来自Iterator对象的特定元素,并且我可以通过iterator.remove()方法删除false元素。当java.util.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; 
    } 

我可以去掉不相关的元素,但是当我看到到Java API来Iterator.reomve(),它说:

void remove(): 从底层集合中移除迭代器返回的最后一个元素(可选操作)。这种方法只能在下一次调用时调用一次。如果除了通过调用此方法以外的任何其他方式进行迭代时修改了底层集合,则未指定迭代器的行为。

我只是为什么它是一个可选操作感到困惑?是否让程序员在使用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; 
      } 
     } 
    } 

} 

回答

15

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

+0

+1很好的例子。 –

+1

好榜样的好解释。 +1。 –

+0

+1非常清晰和教育。 –

2

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