2011-12-07 21 views
7

Estaba tratando de filtrar elementos específicos de un objeto Iterator, y puedo eliminar los elementos falsos a través del método iterator.remove().¿Qué significa cuando el método java.util.Iterator.remove() es 'operación opcional'?

Aquí es mi método talón:

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; 
    } 

puedo eliminar los elementos no relacionados, pero cuando miro en el API Java para Iterator.reomve(), es decir:

void remove(): Elimina de la colección subyacente el último elemento devuelto por el iterador (operación opcional). Este método se puede llamar solo una vez por llamada al siguiente. El comportamiento de un iterador no se especifica si la colección subyacente se modifica mientras la iteración está en progreso de ninguna otra manera que llamando a este método.

Acabo de confundir por qué es una operación opcional? ¿Es una advertencia que el programador tenga más cuidado al usar el método remove()? o tiene otros significados?

Gracias a todos por adelantado por ayuda.

Y todo el código que estaba compilando está por debajo de su referencia:

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; 
      } 
     } 
    } 

} 

Respuesta

15

Esto significa que por el contrato de la API, no se requiere el método remove() a implementarse/disponible en todas las implementaciones. Esto se debe a que en algunas implementaciones, simplemente puede no tener sentido, o no sería factible implementarlo. Un buen ejemplo sería el iterador devuelto en una colección de solo lectura, como el devuelto por Collections.unmodifiableCollection().

+0

+1 Buen ejemplo. –

+1

Buena explicación con buen ejemplo. +1. –

+0

+1 Muy claro y educativo. –

2

Esto solo significa que es opcional para las implementaciones de Iterator. Algunas implementaciones proporcionan funcionalidad para admitirlo, mientras que otras pueden arrojar un UnsupportedOperationException. En su caso, está utilizando un Iterator que sí admite esa operación, por lo que está bien.

Cuestiones relacionadas