MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Java-Syntax mit MongoDB

Sie können natürlich das von Ihnen vorgeschlagene Formular verwenden:

for (Document document : col.find()) {
    // do something
}

Es führt zu einem Problem, wenn der Körper der for-Schleife eine Ausnahme auslöst:In diesem Fall wird der Cursor nicht geschlossen. Das richtige Idiom, um sich davor zu schützen, ist die explizite Verwendung von MongoCursor (das Closeable implementiert):

try (MongoCursor<Document> cursor = col.find().iterator()) {
    while (cursor.hasNext()) {
        System.out.println(cursor.next());
    }
}

Die forEach-Methode ist nur ein bisschen syntaktischer Zucker, um zu vermeiden, dass sich der Anwendungscode Sorgen machen muss, den Cursor so manuell schließen zu müssen.

Wenn Sie nicht für jede Iteration einen neuen Block erstellen möchten, können Sie Ihren Code umgestalten und die Erstellung der anonymen inneren Klasse herausziehen, z. B.:

Block<Document> block = new Block<Document>() {
    @Override
    public void apply(final Document document) {
        System.out.println(document);
    }
};
col.find().forEach(block);

Das ist natürlich noch klobiger, wenn Sie also Java 8 verwenden können, können Sie das Ganze durch ein Lambda ersetzen:

col.find().forEach((Block<Document>) document -> {
    System.out.println(document);
});

oder in diesem Fall einfach:

col.find().forEach((Block<Document>) System.out::println);

Die Lambda-Metafabrik stellt sicher, dass keine unnötigen Objekte erstellt werden.