Java:返回for循环

时间:2015-03-29 04:53:53

标签: java loops

有没有办法从for循环中返回一些值而不跳出循环?

我正在实现一个静态分析工具,我必须在for循环中分析方法列表(CFG)。 CFG列表的大小事先不知道。 for循环中的每个方法都必须返回一些值。如上所述,有没有办法在循环中执行它而不会破坏循环?一个可能的替代方案是我可以展开循环,假设最大列表大小可能是一些固定值。但这并不能完全解决问题。任何帮助将不胜感激。

代码如下所示。

for(CFG cfg: cfgList)
{
   val = analyze(cfg);
   return val;   //I want for loop not to stop here.
}

P.S。我无法将值存储在列表中以便稍后返回值。

EDIT1:

例如,请考虑以下陈述。

call method1();
st2;
st3;
...

此方法1()可以是五种不同方法中的任何一种。对于所有五种可能的选项,我想分析它们中的每一个,返回它们的值并相应地分析其余的语句。所以,我将分析以下5种方法。

call method1-option1();
st2;
st3;
...

call method1-option2();
st2;
st3;
...

call method1-option3();
st2;
st3;
...

希望,它有助于理解这个问题。

3 个答案:

答案 0 :(得分:1)

如果不跳出它,你就无法从循环中返回值。根据您的需要,您必须在其他列表中保存值,并且可以在完成循环后返回该列表。

答案 1 :(得分:1)

在Java 8中,您可以这样做:

Iterator<AnalysisResult> lazyAnalysisResults = cfgList.stream()
    .map(cfg -> analyze(cfg))
    .iterator();

然后Iterator将一次提供一个新的分析结果,而无需先将它们全部收集到列表中。

在Java 8之前,如果您希望转换变得懒惰,那么您可以做的最好的事情就是自己实现Iterator

public final class AnalyzingIterator extends Iterator<AnalysisResult> {
  private final Iterator<CFG> iter;

  public AnalyzingIterator(Iterator<CFG> iter) {
    this.iter = iter;
  }

  @Override public boolean hasNext() {
    return iter.hasNext();
  }

  @Override public AnalysisResult next() {
    return analyze(iter.next());
  }

  @Override public boolean remove() {
    throw new UnsupportedOperationException();
  }
}

答案 2 :(得分:0)

如果您不想将结果存储在列表中并将其全部归还,则可以使用callback机制。

使用analyze()开始传递cfg的新主题以及this的引用。当处理结束时,处理线程调用当前实例/线程上的回调方法传递分析的值。继续在回调方法中对此返回值执行任何操作。而且你不必改变你的for循环。