首页 > 解决方案 > 为什么 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泄漏 aMongoCursor不会关闭,因此,如果遵循弃用注释,大量游标将通过更改为Iterable.forEach.

MongoIterable.forEach那么,当替换泄漏游标对象时,为什么将其标记为已弃用?

标签: javamongodb

解决方案


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(Block block) 是有意义的,以便可以在下一个主要版本中将其删除,并且用户将不再收到编译器错误。


推荐阅读