【问题标题】:Java iterators and for-each-loop. any way to access the underlying iterator?Java 迭代器和 for-each-loop。有什么方法可以访问底层迭代器?
【发布时间】:2011-04-25 22:03:15
【问题描述】:

我非常喜欢 Java 中的 for-each-loop 构造 (for(T e : iterable)),它适用于任何 Iterable<T>,因为它在许多情况下都非常易于阅读和编写代码。

我想知道是否有任何方法可以从这样的循环中访问底层迭代器。如果我想使用迭代器中的remove(),这可能是强制性的。

【问题讨论】:

    标签: java iterator foreach


    【解决方案1】:

    不,for-each-loop 的全部意义在于抽象出底层迭代器。

    如果你需要它,你必须声明它。

    【讨论】:

    • 当你声明它时,如果你打算从列表中删除项目,它应该是一个 ListIterator。
    【解决方案2】:

    不,您不能在 for each 循环中删除对象。

    改用这个:

    Iterator<Type> it = collection.iterator();
    
    while (it.hasNext()) {
       if (it.next().shouldBeRemoved()) {
           it.remove();
       }
    }
    

    【讨论】:

    • 我一般更喜欢for 成语而不是while 成语,因为它使迭代器的范围更小。
    • @dty:您希望尽可能缩小所有变量的范围是有道理的。但对我来说,代码可读性是第一位的。我的版本几乎可以像普通句子一样阅读:'当迭代器有下一个元素时,请执行以下操作:...',而你的似乎很麻烦。因此,如果我们想从这两种方法中获益,值得将我的代码提取到一个单独的方法中。恕我直言,这是我们能做的最好的事情。
    【解决方案3】:

    改用 for 循环。

    【讨论】:

      【解决方案4】:

      如果集合相当小,如果您希望能够删除元素,您也可以使用集合的副本进行迭代,这样您就不必像有两个集合一样行事。

      for(T e : collection.clone())
          if(e.shouldBeRemoved())
              collection.remove();
      

      更好的是,Apache CollectionUtils(可能还有一个 Google 替代方案和一个泛型替代方案)提供了filter(java.util.Collection collection, Predicate predicate)。此示例返回整个列表。您可以存储谓词以供重复使用。

      CollectionUtils.filter(collection, new Predicate(){
              boolean evaluate(Object object){return true;}
          });
      

      【讨论】:

        【解决方案5】:

        您是对的,使用 Iterator 支持通过在 Iterator 本身上调用 remove() 来安全地从源集合中删除对象的能力。这里的重点是避免 ConcurrentModifiedException ,这意味着在 Iterator 针对它打开时修改了集合。一些集合可以让您在遍历集合时轻松移除或添加元素,但在迭代器上调用 remove() 是一种更安全的做法。

        但 Iterator 支持派生的和更强大的表亲 ListIterator,仅在 Lists 中可用,支持在迭代期间添加和从 List 中删除,以及在 Lists 中双向滚动。

        【讨论】:

          【解决方案6】:

          修改数据有一种错误的感觉,只需创建一个新的Iterable(或集合)并添加您想要保留的项目,其他时间在for循环中丢失((有点**

          【讨论】:

          • 你们没听说过函数式编程
          猜你喜欢
          • 2015-05-21
          • 2010-10-03
          • 2016-06-15
          • 1970-01-01
          • 2011-02-05
          • 2022-11-14
          • 2018-11-07
          • 2021-08-24
          • 1970-01-01
          相关资源
          最近更新 更多