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
被标记为不推荐使用?
答案 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),以便可以在下一个主要版本中删除它 用户将停止获取编译器错误。