我将介绍MongoDB for java.有一些示例代码可以检索集合中的所有文档.代码是有效的,但我觉得有点...因为没有更好的词而笨重.我想知道是否有特定的原因使它成为必要.举个例子:

FindIterable<Document> iterable = db.getCollection("restaurants").find();
iterable.forEach(new Block<Document>() {
    @Override
    public void apply(final Document document) {
        System.out.println(document);
    }
});

在上面的例子中,在forEach的每次迭代中都必须创建Block个实例,这有什么原因吗?为什么不做一些更简单的事情,比如:

FindIterable<Document> iterable = db.getCollection("restaurants").find();
for (Document document : iterable) {
    System.out.println(document);
}

推荐答案

你当然可以使用你建议的形式:

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方法只是一点语法糖分,以避免应用程序代码担心必须像这样手动关闭光标.

如果你不想为每次迭代创建一个新的块,你可以重构你的代码,go 掉匿名的内部类创建,例如:

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

当然,这更笨重,所以如果你能使用Java 8,你可以用lambda替换整个东西:

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

或者在这种情况下,简单地说:

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

lambda metafactory将确保不会创建不必要的对象.

Mongodb相关问答推荐

MongoDB与合并对象聚合

在mongdob中按子文档筛选不起作用

Mongoose 排除数组中包含特定嵌套对象的文档

Mongo $sort然后$group,顺序能保证吗?

Mongo,通过 Lookup 计算多个文档中数组中的项目

MongoDB - 使用许多嵌套对象更新嵌套数组

在运算符 $map 中嵌入运算符 $exists

MongoDB - 文档中多个数组大小的总和

无法让 Mongoose.js 子文档数组填充

Mongo C#忽略属性

删除嵌套文档数组中的嵌入文档

升级mongodb

Clojure 和 NoSQL 数据库

$elemMatch 的 MongoDB 索引

将 mongodb 聚合框架结果导出到新集合

如何在 MongoDB Map-reduce 映射函数中使用变量

Python Django-REST-framework 和 Angularjs 的文件夹 struct

MongoDB 连接字符串到副本集

show dbs 给出Not Authorized to execute command错误

全局初始化失败:BadValue Invalid or no user locale set.请确保正确设置 LANG 和/或 LC_* 环境变量