簡體   English   中英

增強的for循環不接受Iterator

[英]Enhanced for-loop does not accept Iterator

如果有人問過這個問題,請原諒。 我的搜索沒有提出任何其他類似的問題。 這讓我在Java中感到驚訝。

顯然,增強的for循環只接受java.lang.Iterable的數組或實例。 它不接受java.util.Iterator作為迭代的有效obj引用。 例如,Eclipse顯示以下代碼的錯誤消息。 它說:“ 只能迭代數組或java.lang.Iterable的實例

Set<String> mySet = new HashSet<String>();
mySet.add("dummy");
mySet.add("test");
Iterator<String> strings = mySet.iterator();
for (String str : strings) {
    // Process str value ...
}

為什么會這樣? 我想知道為什么增強的for循環被設計為以這種方式工作。 雖然Iterator不是集合,但它可以用於從集合中一次返回一個元素。 請注意, java.lang.Iterable接口中唯一的方法是Iterator<T> iterator() ,它返回一個Iterator 在這里,我直接遞給它一個Iterator 我知道可以使用hasNext()next()但使用增強的for循環使它看起來更干凈。

我現在理解的一件事是我可以直接在mySet使用增強的for循環。 所以我甚至不需要額外的電話來獲得Iterator 所以,這將是對此進行編碼的方式,是的 - 它確實有意義。

在Java 5中引入了增強的for循環作為迭代Collection [或數組]的所有元素的簡單方法。

http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/enhanced-for-loops.html

迭代器不是元素的集合,

它是一個使程序員能夠遍歷容器的對象。 迭代器可以被認為是一種指針。

https://en.wikipedia.org/wiki/Iterator

因此,通過遍歷包含元素的結構中的所有元素來增強for循環的工作,而迭代器不包含元素,它更像是指針。

增強的for循環是JSR 201的一部分。 從該頁面,您可以下載擬議的最終草案文檔,其中包括直接解決您問題的常見問題解答部分:

附錄I.設計常見問題

  1. 為什么我不能將增強型for語句與Iterator(而不是Iterable或數組)一起使用?

有兩個原因:(1)如果你的代碼中有一個顯式的迭代器,那么構造在語法改進方面不會提供太多的東西,並且(2)循環的執行會產生推進的“副作用”(通常是用盡)迭代器。 換句話說,增強的for語句為迭代集合或數組的常見情況提供了一個簡單,優雅的解決方案,並沒有嘗試解決更復雜的情況,這些情況可以通過傳統的for語句更好地解決。

  1. 為什么我不能使用增強的for語句:
    • 在遍歷集合時移除元素(“過濾”)?
    • 同時迭代多個集合或數組?
    • 修改數組或列表中的當前插槽?

見上文第1項。 專家組考慮了這些案例,但選擇了一個簡單,干凈的擴展,這樣做(sic)很好。 該設計遵循“80-20規則”(它處理80%的案例,占20%的努力)。 如果一個案例屬於另外20%,你可以像過去一樣使用顯式迭代器或索引。

換句話說,委員會選擇限制提案的范圍,並且人們可以想象成為提案的一部分的一些特征沒有削減。

在您的示例中,您正在創建迭代器但未正確使用它。 至於回答你為什么拋出異常的問題 - 這是從線上:

 for (String str : strings) {

“strings”在這里是一個迭代器,而不是你可以迭代的集合。 因此,您可以使用增強的for循環來迭代整個集合中的一些選項:

for(String myString : mySet){
    //do work
}

或者您可以使用迭代器遍歷集合:

Iterator<String> strings = mySet.iterator();
while(strings.hasNext()){
    //do work
}

希望你覺得這很有幫助。

出現錯誤的原因是您嘗試迭代Iterator ,而不是ListCollection 如果你想使用Iterator ,我建議你使用next()hasNext()方法:

Set<String> mySet = new HashSet<String>();
mySet.add("dummy");
mySet.add("test");
Iterator<String> strings = mySet.iterator();
while(strings.hasNext()){
    String temp = strings.next();
    System.out.println(temp);
}

暫無
暫無

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

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