Ajo*_*tia 6 java iteration foreach
如果有人问过这个问题,请原谅.我的搜索没有提出任何其他类似的问题.这让我在Java中感到惊讶.
显然,增强的for循环只接受一个数组或一个实例java.lang.Iterable.它不接受java.util.Iterator作为迭代的有效obj引用.例如,Eclipse显示以下代码的错误消息.它说:" 只能迭代数组或java.lang.Iterable的实例 "
Set<String> mySet = new HashSet<String>();
mySet.add("dummy");
mySet.add("test");
Iterator<String> strings = mySet.iterator();
for (String str : strings) {
// Process str value ...
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我想知道为什么增强的for循环被设计为以这种方式工作.虽然Iterator不是集合,但它可以用于从集合中一次返回一个元素.请注意,java.lang.Iterable接口中唯一的方法是Iterator<T> iterator()返回一个Iterator.在这里,我直接交给他Iterator.我知道hasNext()并且next()可以使用但是使用增强的for循环使它看起来更干净.
我现在理解的一件事是我可以直接使用增强的for循环mySet.所以我甚至不需要额外的电话来获得Iterator.所以,这将是对此进行编码的方式,是的 - 它确实有意义.
在Java 5中引入了增强的for循环作为迭代Collection [或数组]的所有元素的简单方法.
http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/enhanced-for-loops.html
迭代器不是元素的集合,
它是一个使程序员能够遍历容器的对象.迭代器可以被认为是一种指针.
https://en.wikipedia.org/wiki/Iterator
因此,通过遍历包含元素的结构中的所有元素来增强for循环的工作,而迭代器不包含元素,它更像是指针.
增强的for循环是JSR 201的一部分。您可以从该页面下载建议的最终草案文件,其中包括一个直接解决您的问题的FAQ部分:
附录I.设计常见问题解答
- 为什么不能将增强的for语句用于Iterator(而不是Iterable或数组)?
有两个原因:(1)如果您的代码中有显式的迭代器,则该构造不会在语法改进上提供太多帮助;(2)循环的执行将带来“副作用”,即“前进”(通常是耗尽)迭代器。换句话说,增强的for语句为在集合或数组上迭代的常见情况提供了一种简单,优雅的解决方案,并且不会尝试解决更复杂的情况,而传统的for语句可以更好地解决这些情况。
- 为什么我不能使用增强的for语句来:
- 在遍历集合时删除元素(“过滤”)?
- 同时遍历多个集合或数组?
- 修改数组或列表中的当前插槽?
请参阅上面的项目1。专家组考虑了这些情况,但选择了简单明了的扩展名,从而很好地证明了一件事情。该设计遵循“ 80-20规则”(处理80%的案件需要20%的努力)。如果一个案例属于其他20%,则可以始终像过去一样使用显式迭代器或索引。
换句话说,委员会选择限制提案的范围,而人们可以想象成为提案一部分的某些功能并没有削减。