Selvom du helt sikkert kan bruge den formular, du foreslog:
for (Document document : col.find()) {
// do something
}
det introducerer et problem, når kroppen af for-løkken kaster en undtagelse:hvis dette sker, vil markøren ikke blive lukket. Det rigtige formsprog at beskytte sig imod er at bruge MongoCursor (som implementerer Closeable) eksplicit:
try (MongoCursor<Document> cursor = col.find().iterator()) {
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
}
ForEach-metoden er bare en smule syntaktisk sukker for at undgå behovet for applikationskode for at bekymre sig om at skulle lukke markøren manuelt på denne måde.
Hvis du ikke ønsker at oprette en ny blok for hver iteration, kan du refaktorisere din kode og trække den anonyme indre klasseoprettelse ud, f.eks.:
Block<Document> block = new Block<Document>() {
@Override
public void apply(final Document document) {
System.out.println(document);
}
};
col.find().forEach(block);
Det er selvfølgelig endnu mere klodset, så hvis du er i stand til at bruge Java 8, kan du erstatte det hele med en lambda:
col.find().forEach((Block<Document>) document -> {
System.out.println(document);
});
eller i dette tilfælde blot:
col.find().forEach((Block<Document>) System.out::println);
Lambda metafactory vil sikre, at der ikke oprettes unødvendige objekter.