我正在尝试使用for-each
语句替换基于迭代器的Java列表循环,但代码在某些时候使用iterator.hasNext()
检查是否到达列表中的最后一个元素。
for-each
有类似的功能吗?
for (Object current : objectList) {
if (last-element)
do-something-special
}
我正在尝试使用for-each
语句替换基于迭代器的Java列表循环,但代码在某些时候使用iterator.hasNext()
检查是否到达列表中的最后一个元素。
for-each
有类似的功能吗?
for (Object current : objectList) {
if (last-element)
do-something-special
}
for-each只是迭代器版本的语法糖,如果你检查已编译的字节码,你会注意到编译器实际上将其转换为迭代器版本。
使用for-each形式时,你无法检查是否还有更多的元素。如果需要该功能,请继续使用显式迭代器。
Iterator<MyClass> it = myCollection.iterator();
while(it.hasNext()) {
MyClass myClass = it.next():
// do something with myClass
}
翻译成:
for (MyClass myClass:myCollection) {
// do something with myClass
}
正如其他人所说 - 这是不可能的。
只需要记住,foreach结构并不是万能的。它的引入是为了简化一种非常普遍的任务,即对集合中的每个元素执行相同的操作。
在您的情况下,您不想对每个元素执行完全相同的操作 - 因此,foreach循环不是适合这项工作的正确工具。试图“黑客式”地将其强制执行这样做是愚蠢的,只需在经典for循环中使用显式迭代器即可。
foreach
循环(或增强型for
循环)没有跟踪当前正在迭代的元素的功能。没有办法找出正在处理哪个Collection
的索引,或者在Iterable
中是否有更多元素需要处理。foreach
循环中保留对当前迭代对象的引用。foreach
循环结束,就能保留这个引用,在变量中剩下的就是最后一个元素。String lastString = null;
for (String s : new String[] {"a", "b", "c"}) {
// Do something.
// Keep the reference to the current object being iterated on.
lastString = s;
}
System.out.println(lastString);
输出:
c
很遗憾,for each语法不允许您检查一个元素是否是列表中的第一个或最后一个。这是for each循环的已知限制。 我建议您继续使用迭代器。
如果您只需要检查第一个元素而不是最后一个元素,例如在进行字符串连接时,您可以改用以下代码:
boolean first = true;
for (Element e : list) {
if (!first) {
//do optional operation
}
//do other stuff
first = false;
}
但我倾向于使用迭代器。
是的,你可以这样做,如果你不想使用显式迭代器语法,我会这样做:
for (Object current : objectList) {
if (objectList.getLast().equals(current))
do-something-special
}
getLast()
。但是你可以使用这个objectList.size() - 1
来代替它。for (Object current : objectList) {
if (objectList.get(objectList.size() - 1).equals(current))
do-something-special
}
只需保存循环次数,示例:
int loop = 0;
for(Item item : items) {
if(loop == 0) {
//Is First Item
}
if(loop != items.size()-1) {
//Has Next Item
}
if(loop == items.size()-1) {
//Is Last Item
}
//Must Be Last Statement
loop++;
}
这类似于 for(int i = 0; i < items.size(); i++)
循环;
items.size()
用于列表,而 items.length
用于数组;
if (objectList.indexOf(current)==objectList.size()-1) break;
int nElts = objectList.size();
int n = 0;
for (...) {
if (++n == nElts) ...
这是我能想到的最好的。
if !iter.hasNext()
比直接使用显式迭代器更加冗长,不太容易理解,并且出现逻辑错误的概率更高。但是我认为是否更好还要根据具体情况而定。 - Andrzej Doyle