当前位置: 首页 > 面试题库 >

给定迭代器的for-each循环的惯用方式?

茅桐
2023-03-14
问题内容

在Java中添加了增强的for循环(foreach循环)后,它可以与数组或的目标一起使用Iterable

for ( T item : /*T[] or Iterable<? extends T>*/ ) {
    //use item
}

这对于仅实现一种迭代类型并因此具有单个iterator()方法的Collection类非常有用。

但是我发现自己非常想让我使用Collection类中的非标准迭代器感到沮丧。例如,我最近试图帮助某人使用a Deque作为LIFO
/堆栈,然后以FIFO顺序打印元素。我被迫这样做:

for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
   T item = it.next();
   //use item
}

我失去了for-each循环的优势。这不仅与击键有关。如果不需要,我不喜欢公开迭代器,因为很容易犯it.next()两次调用等错误。

现在,理想情况下,我认为for-each循环也应该接受Iterator。但事实并非如此。那么在这种情况下是否有惯用的for-
each循环方式?我也很想听听使用常用集合库(例如Guava)的建议。

在没有辅助方法/类的情况下,我能想到的最好的方法是:

for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
    //use item
}

哪个不值得使用。

我希望看到番石榴有类似的Iterables.wrap用法,但没有找到类似的东西。显然,我可以通过类或辅助方法来滚动自己的Iterator包装器。还有其他想法吗?

编辑: 作为一个旁注,任何人都可以给出为什么增强的for循环不应仅接受a的有效理由Iterator吗?使我适应当前的设计可能会走很长一段路。


问题答案:

我可能要做的只是创建一个称为的实用程序类Deques,如果需要,它可以支持此功能以及其他实用程序。

public class Deques {
  private Deques() {}

  public static <T> Iterable<T> asDescendingIterable(final Deque<T> deque) {
    return new Iterable<T>() {
      public Iterator<T> iterator() {
        return deque.descendingIterator();
      }
    }
  }
}

在另一种情况下,这真的很糟,我们还没有lambda和方法引用。在Java
8中,只要方法引用descendingIterator()与的签名匹配,就可以编写类似的代码Iterable

Deque<String> deque = ...
for (String s : deque::descendingIterator) { ... }


 类似资料:
  • 假设我想要一个使用范围的有限循环: 编译器将发出警告: 有没有更惯用的方法来写这个,不会让编译器抱怨?

  • For Each循环用于为数组或集合中的每个元素执行语句或一组语句。 For Each循环类似于For循环; 但是,为数组或组中的每个元素执行循环。 因此,步进计数器将不存在于这种类型的循环中。 它主要用于数组或在File系统对象的上下文中使用,以便递归操作。 语法 (Syntax) 以下是VBA中For Each循环的语法。 For Each element In Group [state

  • 问题内容: 我想了解更多有关的信息,所以如果我错了,请纠正我。 迭代器是一个对象,该对象具有指向下一个对象的指针,并作为缓冲区或流(即,链表)读取。它们特别有效,因为它们所做的只是通过引用而不是使用索引来告诉您下一步是什么。 但是我仍然不明白为什么会发生以下行为: 经过迭代器()的第一个循环后,就好像它已被消耗并且留空,因此第二个循环()不输出任何内容。 但是,我从未为变量分配新值。 循环幕后到底

  • 问题内容: Java的for-each循环中是否有办法 找出循环已被处理的频率? 除了使用旧的和众所周知的-环,是构建 在for-each循环中提供此类计数器的唯一方法是? 问题答案: 不可以,但是你可以提供自己的柜台。 这样做的原因是,for-each循环在内部不具有一个计数器; 它基于接口,即它使用一个Iterator循环遍历“集合”的过程-可能根本不是一个集合,并且实际上可能根本不是基于索引

  • 在Django模板中,我想创建一个遍历列表的for循环。在循环过程中,我还希望能够使用循环的迭代次数。 例如,如果有4个元素,那么: 应打印以下内容: 我该怎么做呢?

  • 本文向大家介绍Lua中的for循环和迭代器的秘密探究,包括了Lua中的for循环和迭代器的秘密探究的使用技巧和注意事项,需要的朋友参考一下 上一篇我们介绍了,可以使用for循环来完成迭代器的调用,十分简洁。 那么,具体这for循环做了什么呢?我当然没有去看源码,我只是看书而已。 资料来源于《Lua程序设计》第二版,如果这本书的内容没有错的话,那么,本篇文章理论上也不会有错~ 1.返回两个值的迭代器