代码之家  ›  专栏  ›  技术社区  ›  thecoop

为什么mongo不推荐mongoiterable.foreach(block)?

  •  1
  • thecoop  · 技术社区  · 7 年前

    MongoIterable 有两个 forEach 方法:

    Iterable.forEach(Consumer)
    MongoIterable.forEach(Block)
    

    在最近版本的Mango Java驱动程序中, MongoIterable.forEach 已被弃用,其中一条通知指出用户应切换到 Iterable.forEach .

    然而, 蒙古文.foreach 方法或多或少在主实现类中实现,如下所示:

    try (MongoCursor<TResult> cursor = iterator()) {
        while (cursor.hasNext()) {
            block.apply(cursor.next());
        }
    }
    

    没有相应的覆盖 不可更改.foreach . 这意味着 不可更改.foreach 泄漏A MongoCursor 这不会被关闭,因此,如果遵循拒绝注释,那么将通过更改为泄漏大量的光标。 不可更改.foreach .

    那么为什么呢? 蒙古文.foreach 标记为已弃用,当替换泄漏光标对象时?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Kenneth Obando    7 年前

    https://jira.mongodb.org/browse/JAVA-3046 ,这一变化的主要原因是:

    MongoItable上的foreach(block-block)方法 与添加到java.lang.iterable的默认foreach方法冲突 在Java 8中。如果尝试将两者之一与lambda表达式一起使用,则会得到 编译器错误,强制您将lambda强制转换为块或 消费者,这是不直观的。

    但是,iterable中的默认foreach方法使用起来很危险 因为它不可能强制 在consumer.accept引发 例外,但在java-2010的范围内,我们计划解决这个问题。鉴于 因此,有必要取消Mongoiterable ForEach(Block Block)的预测,以便在下一个主要版本中删除它。 用户将停止获取编译器错误。