2011-12-07 63 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,所以沒關係。