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); }