En Java, podemos escribir una clase de contenedor nosotros mismos y podemos usar el bucle for-each (también llamado bucle for mejorado o bucle foreach) para iterar sobre los elementos del contenedor. Para lograr esto, nuestra clase de contenedor debe cumplir las siguientes condiciones:
1. Implementar la interfaz Iterable
Nuestra clase contenedora debe implementar la interfaz java.lang.Iterable. La interfaz contiene un método llamado iterator(), que devuelve un objeto que implementa la interfaz java.util.Iterator para recorrer los elementos del contenedor.
2. Implementar la interfaz Iterator
Nuestra clase de contenedor también debe implementar la interfaz java.util.Iterator. La interfaz Iterator define varios métodos, como hasNext() (juzga si hay un siguiente elemento), next() (devuelve el siguiente elemento) y remove() (elimina el elemento actual del contenedor, operación opcional).
A continuación, el autor usa un ejemplo de código específico para demostrar cómo crear una clase contenedora personalizada y usar el ciclo for-each para recorrerla:
import java.util.Iterator;
// 自定义容器类
class MyContainer<T> implements Iterable<T> {
private T[] elements;
private int size;
@SuppressWarnings("unchecked")
public MyContainer(int capacity) {
elements = (T[]) new Object[capacity];
size = 0;
}
public void add(T element) {
elements[size++] = element;
}
@Override
public Iterator<T> iterator() {
return new MyIterator();
}
// 自定义迭代器类
private class MyIterator implements Iterator<T> {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < size;
}
@Override
public T next() {
return elements[currentIndex++];
}
}
}
public class Main {
public static void main(String[] args) {
MyContainer<String> container = new MyContainer<>(3);
container.add("Apple");
container.add("Banana");
container.add("Orange");
// 使用 for-each 循环遍历容器
for (String fruit : container) {
System.out.println(fruit);
}
}
}
Resultado de salida:
Apple
Banana
Orange
En el ejemplo anterior, creamos una clase de contenedor personalizada MyContainer que implementa la interfaz Iterable y proporciona una clase interna MyIterator que implementa la interfaz Iterator. De esta forma, podemos usar un bucle for-each para iterar sobre los elementos del contenedor.