MongoDB的Java语法

我正在浏览MongoDB for java的介绍。 有一些示例代码可以检索集合中的所有文档。 代码有效,但我发现它有点……笨拙的缺乏一个更好的词。 我想知道是否有一个特定的原因使它成为必要。 给出的例子是:

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

在上面的示例中,是否有必要在forEach每次迭代中创建一个Block实例? 为什么不是更直接的事情:

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

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

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

它会在for循环体引发exception时引入问题:如果发生这种情况,则不会关闭游标。 防范它的正确习惯是明确使用MongoCursor(实现Closeable):

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

forEach方法只是一些语法糖,以避免需要应用程序代码担心必须像这样手动关闭游标。

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

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

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

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

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

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

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

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

 List restaurants = db.getCollection("restaurants").find().into(new ArrayList()); for (Document restaurant : restaurants) { System.out.println(restaurant); }