java - 为什么 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
那么,当替换泄漏游标对象时,为什么将其标记为已弃用?
解决方案
在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) 是有意义的,以便可以在下一个主要版本中将其删除,并且用户将不再收到编译器错误。
推荐阅读
- angular - 如何在 HTML 元素属性值计算中使用 ngFor 索引变量?
- azure - 作为一名软件测试人员,我如何测试 Azure 数据湖中的数据?
- python - 使用 ssd_mobilenet_v2_quantized_300x300_coco 的目标检测模型的损失在每 10k-12k 步后增加
- javascript - 当我滚动时,我的导航栏颜色不想用我的 jquery 改变?
- kotlin - 为什么 Kotlin/Java 函数在实际使用中与文档看起来如此不同?
- reactjs - 变异 redux 在开发中保持状态
- excel - Excel函数拆分单元格
- python - 在 python 中解析 POSTed Excel 文件
- visual-studio-code - 多个框架的 VSCode 设置
- javascript - jquery第n个孩子到root