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(块块),以便在下一个主要版本中删除它,用户将停止获取编译器错误。