Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MongoDB的Java语法_Java_Mongodb - Fatal编程技术网

使用MongoDB的Java语法

使用MongoDB的Java语法,java,mongodb,Java,Mongodb,我将介绍MongoDB for java。有一些示例代码用于检索集合中的所有文档。代码是有效的,但我发现它有点…笨拙,因为没有更好的词。我想知道是不是有什么特别的原因使它成为必要。举个例子: FindIterable<Document> iterable = db.getCollection("restaurants").find(); iterable.forEach(new Block<Document>() { @Override public vo

我将介绍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);
    }
});

您当然可以使用您建议的表格:

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());
    }
}
try(MongoCursor 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);
Block Block=新块(){
@凌驾
公开作废申请(最终文件){
系统输出打印项次(文件);
}
};
col.find().forEach(块);
当然,这更笨重,因此如果您能够使用Java 8,您可以用lambda替换整个组件:

col.find().forEach((Block<Document>) document -> {
    System.out.println(document);
});
col.find().forEach((块)文档->{
系统输出打印项次(文件);
});
或者在这种情况下,简单地说:

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

将确保不会创建不必要的对象。

我问了自己同样的问题,我发现下面的代码很容易处理这种情况:

List<Document> restaurants = db.getCollection("restaurants").find().into(new ArrayList<Document>());

for (Document restaurant : restaurants) {
    System.out.println(restaurant);
}
List restaurants=db.getCollection(“restaurants”).find().into(new ArrayList());
用于(文件餐厅:餐厅){
系统输出打印(餐厅);
}

看看这篇文章,它解释了如何获得你想要的解决方案,@faljbour-这并没有回答我的问题。该线程是关于从一个Mongo版本到另一个版本的API更改。也就是说,它没有讨论forEach循环中
实例的实例化。@Hal50000我认为实现块的匿名类中只有一个对象被创建为iterable.forEach()方法的参数。感谢您的详细回复。问题是,我仍然不清楚实例化
然后使用其
apply(…)
方法的目的。
光标
之间是否存在关系?任何
MongoIterable
类型-如从
find()
返回的内容提供了可在迭代时使用的帮助器方法。它们是
forEach
映射
,当然还有
迭代器
forEach
方法采用一个
,该块包含要对每个文档执行的逻辑。在内部,它将为您迭代
MongoCursor
,并确保它正确关闭。@Ross-谢谢。这就澄清了很多问题-因此在现实世界的示例中,可能有一些逻辑比
System.out.println(…)
内部应用(…)更复杂。问题是:在使用
into()
时,如果出现异常,光标是否会自动关闭?这会将整个结果集复制到内存中的集合中。根据结果的大小,这可能是不切实际的,甚至是不可能的。另一方面,forEach()和company逐个处理条目,这适用于任意大小的结果集。
List<Document> restaurants = db.getCollection("restaurants").find().into(new ArrayList<Document>());

for (Document restaurant : restaurants) {
    System.out.println(restaurant);
}