Chociaż z pewnością możesz skorzystać z sugerowanego formularza:
for (Document document : col.find()) {
// do something
}
wprowadza problem, gdy ciało pętli for zgłasza wyjątek:jeśli tak się stanie, kursor nie zostanie zamknięty. Właściwym idiomem, przed którym należy się strzec, jest jawne użycie MongoCursor (który implementuje Closeable):
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
Metoda forEach to tylko trochę syntaktycznego cukierka, aby uniknąć konieczności martwienia się kodem aplikacji o ręczne zamykanie kursora w ten sposób.
Jeśli nie chcesz tworzyć nowego bloku dla każdej iteracji, możesz zrefaktoryzować swój kod, wyciągając anonimowe tworzenie klasy wewnętrznej, np.:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Oczywiście jest to jeszcze bardziej niezgrabne, więc jeśli potrafisz używać Javy 8, możesz zastąpić całość lambdą:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
lub w tym przypadku po prostu:
col.find().forEach((Block<Document>) System.out::println);
Metafabryka lambda zapewni, że nie zostaną utworzone żadne niepotrzebne obiekty.