あなたが提案したフォームを確かに使うことができますが:
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);
ラムダメタファクトリーは、不要なオブジェクトが作成されないようにします。