Въпреки че със сигурност можете да използвате формуляра, който предложихте:
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);
Разбира се, това е още по-тромаво, така че ако можете да използвате Java 8, можете да замените цялото нещо с ламбда:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
или в този случай просто:
col.find().forEach((Block<Document>) System.out::println);
Ламбда метафабриката ще гарантира, че не се създават ненужни обекти.