Även om du säkert kan använda formuläret som du föreslog:
for (Document document : col.find()) {
// do something
}
det introducerar ett problem när kroppen av for-loopen ger ett undantag:om detta händer kommer markören inte att stängas. Det rätta formspråket att skydda sig mot är att använda MongoCursor (som implementerar Closeable) uttryckligen:
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
ForEach-metoden är bara lite syntaktisk socker för att undvika behovet av programkod för att oroa sig för att behöva stänga markören manuellt så här.
Om du inte vill skapa ett nytt block för varje iteration, kan du omfaktorisera din kod och dra ut den anonyma inre klassskapandet, t.ex.:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Det är förstås ännu tråkigare, så om du kan använda Java 8 kan du ersätta det hela med en lambda:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
eller i det här fallet helt enkelt:
col.find().forEach((Block<Document>) System.out::println);
Lambda-metafactory kommer att säkerställa att inga onödiga objekt skapas.