+-
为什么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被标记为已弃用?

1
投票

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