java - 为什么扩展的 for 循环不适用于迭代器?

标签 java for-loop

<分区>

Possible Duplicate:
Why is Java's Iterator not an Iterable?

我们都知道java的扩展for循环:

List<X> list = ...
for(X x : list) { ... }

我需要的是:

Iterator<X> listIterator = ...
for(X x : listIterator){ ... }

Java 不允许这样做。 我想知道规范不支持这个是否有充分的理由

这是我的用例:

我正在为一种文件格式编写阅读器。这样的文件包含要读取的条目。为了这个例子,假设我正在尝试重新发明 BufferedReader 并且我的元素是字符串。

我对原始的 API 风格很不满意 BufferedReader这迫使我编写丑陋的代码,例如:

for(String line = reader.readLine(); line != null; line = reader.readLine(){
   ...
}

我宁愿有一些像这样的好东西

for(String line : reader){
   ...
}

我当然可以制作我的 BufferedReader实现 Iterable<String> .但这意味着有一个 iterator()可能被多次调用的方法。因为我不能在文件中查找,所以我不能真正支持多个并行迭代器。

有我的 BufferedReader实现 Iterator<String>而不是 Iterable<String>似乎更合理。但是我不能使用 for声明:-(

最佳答案

因为 foreach 循环的约定是迭代每个 元素。如果允许它只使用 Iterator,您可以给它一个使用了一半的 Iterator,它不会知道其中的区别。

Set<String> set = new HashSet(Arrays.asList(new String [] {"One", "Two", "Three"}));
Iterator i = set.iterator();
// Consume the first.
String first = i.next();
for ( String s : i ) { // Error here.

}

我承认这会使事情变得更容易,但它也可能会引入一些严重的错误,因为您不会知道您已经涵盖了集合中的所有条目。

// Works fine because Set is Iterable and the contract is satisfied 
// that this will iterate over <b>all</b> of the entries.
for ( String s : set ) {
}

你总是可以通过制作一个 transient Iterable 来破解它。我现在无法对此进行测试,但类似于:

for ( String s : new Iterable { 
  public iterator<String> () {
    return set.iterator ();
  }
} ) {
}

很麻烦,但应该可以。

关于java - 为什么扩展的 for 循环不适用于迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554920/

相关文章:

java - 如何使用 Selenium WebDriver 和 Java 选择单选按钮?

Java 从主函数调用打印方法并使用来自另一个单独方法的数据

java - 当我这样写 for 循环时,幕后发生了什么

javascript - 如果没有选择复选框则跳出 for 循环

java - 获取具有给定名称的所有文件夹

java - 通过单击鼠标更改 JPanel 的颜色

java - Spring JPA 存储过程具有空值?

python - 滚动操作性能缓慢创建新列

java - 从数组中删除元素(特定于代码)

r - 2 个连续的嵌套 for 循环 - 是否可以使用 data.table 或 apply 进行优化?添加了 data.table 尝试尚未优化