【发布时间】:2012-01-23 04:55:00
【问题描述】:
我们都知道java的扩展for循环:
List<X> list = ...
for(X x : list) { ... }
我需要的是:
Iterator<X> listIterator = ...
for(X x : listIterator){ ... }
Java 不允许这样做。 我想知道规范是否有充分的理由不支持这一点。
这是我的用例:
我正在为一种文件格式编写阅读器。这样的文件包含要读取的条目。为了示例的目的,假设我正在尝试重新发明 BufferedReader 并且我的元素是字符串。
我对原始 BufferedReader 的 API 风格很不满意,这迫使我编写如下丑陋的代码:
for(String line = reader.readLine(); line != null; line = reader.readLine(){
...
}
我宁愿有一些不错的东西
for(String line : reader){
...
}
当然我可以让我的BufferedReader 实现Iterable<String>。但这意味着有一个iterator() 方法可能会被多次调用。由于我无法在文件中查找,因此我无法真正支持多个并行迭代器。
让我的BufferedReader 实现Iterator<String> 而不是Iterable<String> 似乎更合理。但是后来我不能使用for 语句:-(
【问题讨论】:
-
你检查过高级循环是否多次调用“迭代器”方法吗?我会假设它只做一次..
-
标题问题的答案是“因为这是定义语言的方式”。
-
再一次,我不同意它是重复的。我非常清楚这两个接口的概念差异。我在问为什么这种差异与 for 循环有关。我也知道它是这样指定的。我想知道为什么以这种方式指定它。
-
@coding.mof 按照规范只调用一次。
-
扩展的 for 循环和带有迭代器的 for 循环之间没有有效的区别。扩展的 for 循环
for(X x : myList)只是for(Iterator<X> it = myList.iterator(); it.hasNext(); ){X x=it.next();...}的较短版本。在您的情况下,它会尝试从迭代器中获取迭代器(这没有意义)。但针对您的用例:尝试String line=null; while((line = reader.readLine()) != null){ ... }。如果你不知道while循环的行数更合乎逻辑