为什么mongo不推荐使用MongoIterable.forEach(Block)?

时间:2019-02-07 17:31:50

标签: java mongodb

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将泄漏游标的负载。 / p>

那么当替换泄漏游标对象时,为什么MongoIterable.forEach被标记为不推荐使用?

1 个答案:

答案 0 :(得分:1)

https://jira.mongodb.org/browse/JAVA-3046中,说明进行更改的主要原因:

  

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

     

但是,Iterable中默认的forEach方法使用起来很危险   使用MongoIterable,因为它不可能强迫   如果Consumer.accept抛出一个错误,MongoCursor将关闭   例外,但在JAVA-2010范围内,我们计划解决该问题。给定   那,不建议使用MongoIterable#forEach(Block block),以便可以在下一个主要版本中删除它   用户将停止获取编译器错误。