Ответ 1
Хотя вы можете, конечно, использовать форму, которую вы предложили:
for (Document document : col.find()) {
// do something
}
он вводит проблему, когда тело цикла for генерирует исключение: если это произойдет, курсор не будет закрыт. Правильная идиома для защиты от этого заключается в том, чтобы явно использовать MongoCursor (который реализует Closeable):
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
Метод forEach - это всего лишь немного синтаксического сахара, чтобы избежать необходимости в коде приложения, чтобы беспокоиться о необходимости вручную закрыть курсор.
Если вы не хотите создавать новый блок для каждой итерации, вы можете реорганизовать свой код, вытащив анонимное создание внутреннего класса, например:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Конечно, это даже clunkier, поэтому, если вы можете использовать Java 8, вы можете заменить все это на лямбда:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
или в этом случае просто:
col.find().forEach((Block<Document>) System.out::println);
lambda metafactory гарантирует, что не создаются ненужные объекты.