for-each迭代的使用和外部迭代变量的声明

时间:2015-08-06 22:51:55

标签: java foreach

我只是注意到,迭代变量的声明不能在传统的for循环的情况下完成。

比如说,以下是不可能的:

String str;
for(str : strings) {
  // Do something
}

但是对于传统的for循环,我也可以在外面声明迭代循环控制变量,这样我就可以重用它或者将最后一个值放在循环之外。

int i;
for(; i < strings.length; i++) {
  // Do something
}
System.out.println("I iterated upto " + i);

为什么要为每个循环结构保留这样的限制?我同意迭代变量只能从for-each循环中获取一个值。但是为什么不在外部使用它来保持并使用它作为默认值或循环中的最后一个元素值?然而,这种限制看起来如此幼稚,并且在被取消之前感觉像是我的自由。如果这样的事情是可能的,我会编写这样的代码:

String[] strings = new String[]{"First", "Middle", "Last"};
String str = "Default";
for(str : strings) {
  // Do something.
}
if(str.equals("Last") {
 System.out.println("I did a for each iteration and my last value is " + str);
} else {
 System.out.println("I couldn't iterate, so what I can show you is " + str);
}

所以,如果我的字符串数组为空,我会看到一条优雅的信息,因为&#34;我无法迭代,所以我可以告诉你的是默认&#34;。如果我的字符串数组具有上述元素,我可以看到消息为&#34;我为每次迭代做了一次,我的最后一个值是Last&#34;没有额外的布尔变量来检查我是否进入了循环。

同样对迭代变量声明的强制执行,我也遇到了名称空间冲突的另一个问题:

String string = "Hello";
-----------------------
-----------------------
for(String string : strings) {  // I am forced to use a different name for string, though I prefer to use as a string only for my conventional semantics.
  // Do something
}

有些人可能认为这是个人品味。但是,语言结构可以在任何可能的情况下具有足够的通用性。我没有看到任何有效的理由来保持这种范围的限制,特别是对于每个人。是否有意义?让我知道你的想法。

1 个答案:

答案 0 :(得分:0)

不幸的是,你必须使用一个临时变量,如下所示:

String tmp = "default";
for(String str : strings) {
    tmp = str;
    // Do something
}
//tmp here is the last used value in the loop
//And other stuff

注意:您选择的临时变量的名称必须与循环变量不同。

关于循环的设计选择,我认为我们必须将其归结为句法疏忽(具有讽刺意味的是用作语法糖的符号),你无法预先声明该值。

根据您的第二个问题,您如何区分您尝试引用哪个string