Bien que vous puissiez certainement utiliser le formulaire que vous avez suggéré :
for (Document document : col.find()) {
// do something
}
cela introduit un problème lorsque le corps de la boucle for lève une exception :si cela se produit, le curseur ne sera pas fermé. L'idiome approprié pour se prémunir contre cela est d'utiliser MongoCursor (qui implémente Closeable) explicitement :
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
La méthode forEach est juste un peu de sucre syntaxique pour éviter que le code de l'application n'ait à s'inquiéter de devoir fermer le curseur manuellement comme ceci.
Si vous ne souhaitez pas créer un nouveau bloc pour chaque itération, vous pouvez refactoriser votre code en extrayant la création anonyme de la classe interne, par exemple :
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Bien sûr, c'est encore plus maladroit, donc si vous êtes capable d'utiliser Java 8, vous pouvez remplacer le tout par un lambda :
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
ou dans ce cas simplement :
col.find().forEach((Block<Document>) System.out::println);
La méta-usine lambda garantira qu'aucun objet inutile n'est créé.