有什么办法可以从循环中返回一个值并从我离开的地方继续吗?

时间:2013-08-31 06:56:09

标签: java loops return

有什么方法可以从loop返回一个值并从我离开的地方继续?

在以下代码段中,我想返回currVm的当前值。但我无法这样做。

在片段的最里面的循环中:

while(c <= currVm) {
   allocatedVm(currVm);
   c++;
}

调用名为allocatedVm的函数。我想返回currVm的值,然后从我离开的地方重新开始。有什么出路吗?

@Override
public int getNextAvailableVm() {
    Set<String> dataCenters = confMap.keySet();
    for (String dataCenter : dataCenters) {
        LinkedList<DepConfAttr> list = confMap.get(dataCenter);
        Collections.sort(list, new MemoryComparator());
        int size = list.size() - 1;
        int count = 0;
        while(size >= 0) {
            DepConfAttr dca = (DepConfAttr)list.get(count);
            int currVm = dca.getVmCount();
            int c = 0;
            while(c <= currVm) {
                allocatedVm(currVm); // RETURN currVm
                c++;
            }
            count++;
            size--;
        }
    }        
}

3 个答案:

答案 0 :(得分:2)

最好的方法可能是编写一个返回Iterable<Integer>的方法。这在Java中并不像支持生成器函数的语言那样容易(例如C#和Python),但它仍然可行。如果代码很短,你就可以使用一对(嵌套的)匿名内部类:

public Iterable<Integer> foo() {
    return new Iterable<Integer>() {
        @Override public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                // Implement hasNext, next and remove here
            };
        }
    };
}

在你的情况下,我很想把它分成一个单独的非匿名类,但为了简单起见。

无论如何,使用Iterable的重点是Iterator 自然有状态 - 基本上就是它的目的。所以它非常适合您的要求。

另一种相当简单的方法是一次性返回所有元素,并使调用者按需执行分配。显然,如果可能存在大量元素,那么效果不会很好,但它会更容易理解。

答案 1 :(得分:0)

不确定我理解你需要什么,但是:

如果您希望在方法运行期间通知调用方您已获得值的方法,但不希望退出该方法,则可以使用侦听器。

只需创建一个接口作为函数的参数,并在其中包含一个将对象作为参数的函数。

示例:

interface IGotValueListener 
  {
  public void onGotValue(MyClass obj); 
  }

public int getNextAvailableVm(IGotValueListener listener)
  {
  ...
  if(listener!=null)
    listener.onGotValue(...);
  }

现在,为了调用方法,你可以:

int finalResult=getNextAvailableVm(new IGotValueListener ()
  {
  ... //implement onGotValue
  };

答案 2 :(得分:-1)

只需输入return关键字,即可从方法中的任何位置返回。如果你想从不同的地方放置一个功能来恢复你的方法,那么你需要以这种方式考虑你的方法。您可以使用labelsif语句,设置一些静态变量来标记最后一个执行位置。如果您的应用程序不是多线程的,那么您不必担心使用静态变量同步。此外,如果你的方法太大而且难以跟踪/阅读,那么请考虑将其分解为较小的方法。