I když určitě můžete použít formulář, který jste navrhli:
for (Document document : col.find()) {
// do something
}
zavádí problém, když tělo cyklu for vyvolá výjimku:pokud k tomu dojde, kurzor se nezavře. Správný idiom, proti kterému se lze chránit, je explicitně použít MongoCursor (který implementuje Closeable):
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
Metoda forEach je jen trochou syntaktického cukru, aby se kód aplikace nemusel obávat, že bude muset kurzor ručně zavírat, jako je tento.
Pokud nechcete pro každou iteraci vytvářet nový blok, můžete svůj kód přefaktorovat a vytáhnout anonymní vytvoření vnitřní třídy, např.:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
To je samozřejmě ještě neohrabanější, takže pokud jste schopni používat Java 8, můžete to celé nahradit lambdou:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
nebo v tomto případě jednoduše:
col.find().forEach((Block<Document>) System.out::println);
Metafactory lambda zajistí, že nebudou vytvářeny žádné zbytečné objekty.