是否有一种优雅的方式可以对Java中for-each循环的最后一个元素执行某些操作?

Rus*_*ell 17 java foreach programming-languages

我正在使用Java 6.

假设我有一堆猫要喂,并假设myCats已经分类.

for (Cat cat : myCats) {

    feedDryFood(cat);

    //if this is the last cat (my favorite), give her a tuna
    if (...) 
        alsoFeedTuna(cat);
}
Run Code Online (Sandbox Code Playgroud)

我想特别对待我的最后一只猫.

有没有办法在循环内优雅地做到这一点?我能想到的唯一方法是计算它们.

稍微退一步以获得更广泛的图片,是否有任何编程语言支持for-each循环中的这个小功能?

hvg*_*des 28

如果您需要这样做,最好的方法可能是使用Iterator.除此之外,你必须要数.迭代器有一个

hasNext()
Run Code Online (Sandbox Code Playgroud)

可用于确定您是否在迭代的最后一项上的方法.

编辑 - 为了提高可读性,您可以在基于迭代器的循环(psuedo)中执行以下操作:

Cat cat = iter.next();
feedDryFood(cat);

boolean shouldGetTuna = !iter.hasNext();
if (shouldGetTuna) 
    alsoFeedTuna(cat)
Run Code Online (Sandbox Code Playgroud)

通过巧妙使用变量名称,这是相当自我记录的代码.

  • 虽然这肯定回答了这个问题,但我唯一的问题是它没有使代码中的"最后一只猫是最喜欢的并且得到金枪鱼"的要求非常明确.如果迭代器没有下一个项目,那么读者必须考虑为什么猫会被给予金枪鱼. (2认同)

小智 26

@ fbcocq的解决方案

这怎么是一个糟糕的解决方案?只需添加另一个局部变量.

Cat lastCat = null;

for (Cat cat : myCats) {
  feedDryFood(cat);
  lastCat = cat;
}

alsoFeedTuna(lastCat);
Run Code Online (Sandbox Code Playgroud)

编辑:首先设置null以处理myCats未设置lastCat的情况


Pau*_*ier 9

在for-each循环中没有明确的方法可以做到这一点,但直接的方法是直接使用迭代器(for-each隐藏迭代器).

  • 有人继续贬低弯曲 (3认同)

Ano*_*non 8

如果它是一个必须发生在循环中最后一项的特殊行为,那么它应该发生在循环之外,你应该提供让信息逃脱循环的方法:

Cat lastCat = null;
for (Cat cat : cats)
{
    // do something for each cat
    lastCat = cat;
}

if (lastCat != null)
{
    // do something special to last cat
}
Run Code Online (Sandbox Code Playgroud)

我建议将这两个语句的块移动到方法中.


Ree*_*ore 5

直接使用迭代器.

Cat cat
Iterator<Cat> i = myCats.iterator()
while (i.hasNext())
{
    cat = i.next()
    feedDryFood(cat);
    if (!i.hasNext())
    {
        alsoFeedTuna(cat); // Last cat.
    }
}
Run Code Online (Sandbox Code Playgroud)