有没有办法从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;
...
希望,它有助于理解这个问题。
答案 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循环。