Java 每次迭代的使用和外部迭代变量声明

Java 每次迭代的使用和外部迭代变量声明,java,foreach,Java,Foreach,我刚刚注意到,迭代变量的声明不能在for-each之外完成,这与传统for循环的情况类似 例如,以下是不可能的: String str; for(str : strings) { // Do something } 但是对于传统的for循环,我也可以在外部声明迭代循环控制变量,这样我就可以重用它或获取循环外部的最后一个值 int i; for(; i < strings.length; i++) { // Do something } System.out.println("I

我刚刚注意到,迭代变量的声明不能在for-each之外完成,这与传统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);
因此,如果我的字符串数组为空,我将看到一条优美的消息“我无法迭代,所以我可以向您显示的是默认值”。如果我的字符串数组包含如上所述的元素,那么我可以看到消息“我为每个迭代执行了一次,并且我的最后一个值是last”,而不需要额外的布尔变量来检查我是否进入了循环

同样要执行此迭代变量声明,我还面临另一个名称空间冲突问题:

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
}

有人可能会认为这是一种个人品味。然而,只要有可能,这种语言结构就可以具有足够的通用性。我看不出有任何正当的理由对每个人都保持这种范围限制。这有意义吗?请告诉我您的想法。

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

String tmp = "default";
for(String str : strings) {
    tmp = str;
    // Do something
}
//tmp here is the last used value in the loop
//And other stuff
注意:您选择的临时变量的名称必须与循环变量不同

至于循环的设计选择,我认为我们必须将其归因于语法疏忽(讽刺的是,对于用作语法糖的符号),即不能预先声明值


根据您的第二个问题,您将如何区分您试图引用的
字符串

声明范围尽可能有限的变量被认为是一种很好的做法;在我看来,在for循环之外重新使用变量会使代码更难阅读(而且更容易出错)。我同意,但我想说的是,语言不能限制我在这些事情上。
String tmp = "default";
for(String str : strings) {
    tmp = str;
    // Do something
}
//tmp here is the last used value in the loop
//And other stuff