Iterátor jsme při výpisu obsahu seznamu použili tak, že jsme prošli všemi jeho prvky a na každý z nich zavolali nějakou akci, konkrétně výpis metodou print(). Tato situace se v praxi vyskytuje dosti často, takže stojí za úvahu, jakým způsobem bychom takovouto operaci mohli realizovat obecně. V jazycích, které umožňují předávání funkce jako argumentu, je situace poměrně jednoduchá, např. v C++ můžeme vytvořit funkci jako
void forAll(Collection* coll, void (*operation)(void* obj));které předáme kolekci a ukazatel na funkci, jejímž parametrem je odkaz na prvek seznamu. Tato funkce se při průchodu seznamem postupně zavolá pro všechny jeho prvky. Ovšem jak na to v Javě?
Celý vtip spočívá v tom, že operaci forAll() nepředáme ukazatel na funkci, ale referenci na objekt, jenž tuto funkci implementuje jako svou metodu. Tento objekt tedy bude implementovat následující rozhraní:
interface Command { void execute(Object obj); }a funkce forAll() nyní bude vypadat takto:
static void forAll(List list, Command command) { Iterator it = list.iterator(); while( it.hasNext() ) { command.execute(it.next()); } }
Uvedené řešení má proti variantě s ukazatelem na funkci ještě jednu výhodu. Jako parametr command můžeme předat libovolný objekt, jenž rozhraní Command implementuje. Tento objekt pak může nést další stavové informace a poskytovat další operace potřebné k provedení akce. Ukážeme si to na následujícím příkladu.
Java umožňuje ještě podstatně kompaktnější zápis řešení předchozího příkladu pomocí anonymní třídy:
Command cmd = new Command() { int index = 0; public void execute(Object obj) { index++; System.out.println(index + ": " + obj); } }; forAll(coll, cmd);
Podstatným rozdílem je zde to, že třídu použitou pouze na jednom místě programu nemusíme pojmenovávat, její tělo uvedeme ve složených závorkách přímo za voláním konstruktoru bázové třídy nebo rozhraní.