为什么mongo弃用了MongoIterable.forEach(Block)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么mongo弃用了MongoIterable.forEach(Block)?相关的知识,希望对你有一定的参考价值。

MongoIterable有两个forEach方法:

Iterable.forEach(Consumer)
MongoIterable.forEach(Block)

在mongo java驱动程序的最新版本中,MongoIterable.forEach已经被弃用,并且通知说用户应该切换到Iterable.forEach

但是,MongoIterable.forEach方法在主要实现类中实现或多或少如此:

try (MongoCursor<TResult> cursor = iterator()) {
    while (cursor.hasNext()) {
        block.apply(cursor.next());
    }
}

而且没有对应的Iterable.forEach覆盖。这意味着Iterable.forEach泄漏了一个没有关闭的MongoCursor,因此,如果遵循弃用注释,则会通过更改为Iterable.forEach来泄漏游标的负载。

那么当更换泄漏光标对象时,为什么MongoIterable.forEach被标记为已弃用?

答案

https://jira.mongodb.org/browse/JAVA-3046,说改变的主要原因:

MongoIterable上的forEach(Block block)方法与在Java 8中添加到java.lang.Iterable的默认forEach方法冲突。如果您尝试使用lambda表达式,则会出现编译器错误,迫使您将lambda强制转换为阻止或消费者,这不直观。

但是,Iterable中的默认forEach方法与MongoIterable一起使用是危险的,因为在Consumer.accept抛出异常的情况下,它不可能强制关闭MongoCursor,但在JAVA-2010的范围内,我们计划解决那。鉴于此,有必要弃用MongoIterable#forEach(块块),以便在下一个主要版本中删除它,用户将停止获取编译器错误。

以上是关于为什么mongo弃用了MongoIterable.forEach(Block)?的主要内容,如果未能解决你的问题,请参考以下文章

`shouldOverrideUrlLoading` 真的被弃用了吗?我可以用啥代替?

什么被弃用了?如何在所有版本中处理它?

AUGraph 在 iOS 上被弃用了吗?如果是这样,啥时候?

正在显示弃用警告“不推荐使用 server/replset/mongos/db 选项”

正在显示弃用警告“不推荐使用 server/replset/mongos/db 选项”

谷歌地图 v2 中是不是弃用了“构造函数 LocationRequest()”?