簡體   English   中英

增強型 for 循環中的循環變量

[英]Loop variable in enhanced for loop

以下工作正常,

int i;
for (i = 0; i < 10; i++) {}

但這不

// a is an ArrayList of Integers
Integer i;
for (i: a) {}

我被迫這樣做:

for (Integer i : a) {}

為什么第二個循環不起作用?

這樣想:如果你總是初始化你的變量會發生什么?

在第一種情況下:它在這個例子中被初始化,顯然沒問題。

在第二種情況下:你初始化它,比如說,1。現在你有一個變量,“1”,你把它扔到這個 for 循環中。 “for(1:a)”。 這意味着什么?? 如果你為 a 中的每個值覆蓋“i”的值,那么當它從循環中出來時,它只是 A 中的最后一個條目。同樣,這到底是什么意思? 為什么會有用? 這個循環之外的其余代碼如何影響? 支持它是糟糕的設計,它會導致各種瘋狂的、意外的行為和不可讀的代碼。

在第三種情況下:您的變量在該循環的范圍內顯式聲明,並且非常明顯是臨時的。 它將完成從該數組中提取您需要的內容並完成的工作。 對外部代碼段的任何修改都需要使用顯式設置器有意地進行。 注意這里不能初始化,因為初始化沒有意義。

對於 for 循環,您需要 3 條語句。 您的第二個循環只有 2 個語句,而您的第一個循環有 3 個。最重要的是,您從未初始化過整數 i。 確保做

int i =0; 
for(i;i<=10;i++){
}

對於增強的 for 循環,您必須具有

for (String element : array) {
System.out.println("Element: " + element);
}

您可以查看此鏈接,它可能會有所幫助。 Java中增強的for循環的語法是什么?

您必須在數組列表中明確給出要迭代的對象類型。 在第一個 for 循環中,您只是插入索引。 在第二種情況下,您試圖讓 for 循環抓取對象而不知道它是什么類型的對象。

增強的 for 語句等效於以下形式的基本 for 語句:

for (Iterator i = Expression.iterator(); i.hasNext(); ) {
     TargetType Identifier = (TargetType) i.next();
     ...
}

14.14.2. 增強的 for 語句

這是正常的 for 循環使用。 您可以在 for 之外聲明變量類型

 int i;
 for (i = 0; i < 10; i++) {}

或者

  Integer i;
  for (i = 0; i < 10; i++) {
        System.out.println(i);
    }

第二個,如果你想使用泛型類型的 foreach(也稱為增強的 For 循環),語法必須是:

for(data_type variable : array | collection){}  

希望這有幫助!

根據JLS (參見15.27.2. Lambda Body最底部) -在增強型 for 循環的每次迭代中,我們都有一個全新的i變量=> 我們不能重用 ( Integer i; ) 在循環之前聲明的變量。

我們在每個循環中都有一個全新的變量,因此我們在這里有聲明語法: for(Integer i : array)因為它在每次迭代中一次又一次地被聲明。

證明來自關於 lambdas 的 JLS 代碼示例:

void m9(String[] arr) {
    for (String s : arr) {
        foo(() -> s);
        // Legal: s is effectively final
        // (it is a new variable on each iteration)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM