Hoewel je zeker het formulier kunt gebruiken dat je hebt voorgesteld:
for (Document document : col.find()) {
// do something
}
het introduceert een probleem wanneer de hoofdtekst van de for-lus een uitzondering genereert:als dit gebeurt, wordt de cursor niet gesloten. Het juiste idioom om daartegen te waken is om MongoCursor (die Closeable implementeert) expliciet te gebruiken:
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
De forEach-methode is slechts een beetje syntactische suiker om te voorkomen dat applicatiecode zich zorgen hoeft te maken over het handmatig sluiten van de cursor op deze manier.
Als u niet voor elke iteratie een nieuw blok wilt maken, kunt u uw code refactoren en de anonieme creatie van de innerlijke klasse verwijderen, bijvoorbeeld:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Dat is natuurlijk nog onhandiger, dus als je Java 8 kunt gebruiken, kun je het hele ding vervangen door een lambda:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
of in dit geval gewoon:
col.find().forEach((Block<Document>) System.out::println);
De lambda-metafactory zorgt ervoor dat er geen onnodige objecten worden gemaakt.