“continue”关键字的替代方案

10

我在查看关于 continue 关键字的问题,以更好地理解它,并偶然发现了这行话在这个答案中

这些可能是维护上的时间炸弹,因为“continue” /“break”与其所继续/中断的循环之间没有直接的联系,除了上下文;

我有这个 for 循环:

for(Object obj : myArrayList){
  if(myArrayList.contains(someParticularData)){
       continue;
    }
   //do something
}

现在,我的问题是——像我上面那样使用continue是否可以,或者它是否存在任何问题? 如果有,我可以遵循什么替代方法?任何指导都将有所帮助。谢谢。

更新:在这种特定情况下,我的目标是迭代一个 Collection(在本例中为 ArrayList),检查它是否包含某些特定数据,并在为真时跳过该迭代。 有人指出myArrayList.contains(someParticularData)是一次性操作,最好在循环外执行该检查,这正是我所期望的。另外,我了解到如果我可以根据某个条件if(someCondition)使用continue,那么我完全可以通过使用if(!someCondition)来避免它。


我认为这取决于您希望循环如何工作。 - Christian Tapia
3
使用方法取决于您的逻辑实现。一种方案并不适用于所有情况。 - RaceBase
如果您嵌套循环,将会影响代码的可读性和维护工作;否则,这是可以接受的。 - Not a bug
如果您认为问题不适合在SO上发布,请不要将其标记为“主观性强”。相反,可以考虑将其迁移到程序员交流平台 - Grijesh Chauhan
略微相关的旁注:在某种程度上,使用continue/break可以等同于单一功能退出点的概念。https://dev59.com/PXVD5IYBdhLWcg3wQZUg - zamnuts
3个回答

17
for(Object obj : myArrayList){
    if(someCondition){
       continue;
    }
    //do something 
}

可以被替换为:

for(Object obj : myArrayList){
    if(!someCondition){
       //do something 
    }
}

我认为,只要你没有使用太多(如2-3个)continue/break/return语句,代码维护就不会有问题。


13

这段代码 用处不大

  for(Object obj : myArrayList) {
    // You're checking again and agian the condition that's loop independent
    if(myArrayList.contains(someParticularData)){
      continue;
    }
   //do something
  }

一个更有效的实现方式是(首先检查是否需要循环

  if (!myArrayList.contains(someParticularData))
    for(Object obj: myArrayList) {
      //do something
    }

continue在这种情况下非常方便:

  for(Object obj : myArrayList) {
    // Check for each item: do we need to proceed this item
    if (someArrayList.contains(obj))
      continue;

    //do something
  }

2
好的发现!我漏掉了。 - user180100
很抱歉,您是在问我是否需要检查for循环吗?如果是的话,是的,我需要遍历一个Collection,并且在其中包含特定数据的情况下,跳过该迭代。 - Anjan Baradwaj
1
@AnjanBaradwaj - Dmitry 的意思是 "ArrayList.contains()" 是一次性操作.. 把它放在 for 循环中并没有帮助.. - TheLostMind
@TheLostMind 已经明白了,感谢您的澄清。 - Anjan Baradwaj
@Dmitry,我猜最后一段代码中的“Contains”应该是小写? - Dennis Meng
@Dennis Meng:是的,谢谢!我还没有从C#(其中“Contains”大写)转换到Java。 - Dmitry Bychenko

1
每当您在某个值范围上进行循环时,您都会处理初始和最终之间的每个值...
例如,如果您正在对奇数进行加法运算。 使用增量为2的循环比为每个奇数值继续更方便。
for (int i = 0; i < 100 ; i=i+2){
   // do addition
}

但是,如果您正在修改循环中被检查的值,那么使用continuebreak是一个好的实践方法。
例如,
boolean flag = false;
// flag will be modified in some iteration of loop, but you don't know which.
for ( int i = 0 ; i < 100 ; i++ ) {
   if ( flag ) {
      continue;
   }
   // flag modified somewhere..
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接