gpt4 book ai didi

MongoDB 的 Java 语法

转载 作者:IT老高 更新时间:2023-10-28 13:08:04 24 4
gpt4 key购买 nike

我正在阅读 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 方法只是一个语法糖,以避免应用程序代码担心必须像这样手动关闭光标。

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

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 的 Java 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com