2016-08-04 74 views
6

在Java中,可以在for -loop的初始化部分来声明一个变量:是否有可能在Java中声明一个变量而有条件?

for (int i=0; i < 10; i++) { 
    // do something (with i) 
} 

但随着while声明这似乎并不可能。

很多时候我看到这样的代码,当条件while循环需要在每次迭代后进行更新:

List<Object> processables = retrieveProcessableItems(..); // initial fetch 
while (processables.size() > 0) { 
    // process items 
    processables = retrieveProcessableItems(..); // update 
} 

这里的计算器,我发现至少a solution防止取的的重复代码可处理物品:

List<Object> processables; 
while ((processables = retrieveProcessableItems(..)).size() > 0) { 
    // process items 
} 

但是该变量仍然必须在while循环之外声明。

因此,我想保持我的变量作用域是干净的,是否可以在while条件中声明一个变量,或者是否存在其他解决方案?

+0

有一个'do-while'循环在这种情况下听起来像是一个很好的候选人。声明将不得不停留在循环之外,但至少您将只有一个赋值而不是两个赋值。 –

+0

@JaroslawPawlak - 那么,我上面的最后一个'while'例子会有什么不同呢? –

+0

清洁代码。它不会在布尔表达式中隐藏赋值。 –

回答

7

您可以使用for循环写while循环:

while (condition) { ... } 

相同

for (; condition;) { ... } 

因为在basic for statement declaration的括号内所有三位都是可选:

BasicForStatement: 
    for ([ForInit] ; [Expression] ; [ForUpdate]) Statement 

同样,你可以重写y我们while环路作为for循环:

for (List<Object> processables; 
    (processables = retrieveProcessableItems(..)).size() > 0;) { 
    // ... Process items. 
} 

需要注意的是一些静态分析工具(如eclipse 4.5)可能要求将初始值分配给processables,例如, List<Object> processables = null。根据JLS的说法,这是不正确的;我的版本javac不会抱怨,如果该变量最初未分配。

+0

删除你最后的想法。为了清晰的良心,紫外线。 – Bathsheba

+0

对不起,for循环重新引入了重复代码问题,因为在语句的* increment *部分更新'processables'需要处理(列表 processables = retrieveProcessableItems(..); processables)。 size()> 0; processables = retrieveProcessableItems(..))' –

+0

应该不需要初始赋值为'null'吗? – Bathsheba

4

不,这是不可能的。

它并没有真正太大的意义之一:不像for循环,你可以设置“循环变量”的初始状态,在while循环您测试的现有变量的值,类似于到for循环的条件检查

当然,如果你关心的变量“泄漏”到你的代码的其他部分,你可以附上了整个事情的一个额外的范围块:

{ 
    /*declare variable here*/ 
    while(...){...} 
} 

另外,转换while环成一个for循环。

+0

我认为比接受的答案更好,更清洁。更具可读性。 – rpax

+0

@rpax虽然它可能更清洁,但我只是将其视为我的问题的解决方法。我当然知道我可以用花括号人为地限制变量的范围,但那不是我要求的。另一个答案更多地考虑了替代解决方案,其中'for'实际上可以替代'while'循环。 –

相关问题