摘要:具體原因在后面說明是必須實現(xiàn)的接口,返回了一個迭代器。迭代器,可以對已知集合進(jìn)行遍歷操作。這里可以看出,循環(huán)最終其實是會使用方法獲取迭代器,來完成遍歷。
概述
迭代器,提供了在不了解集合內(nèi)部實現(xiàn)方法的時候遍歷集合的能力??梢詫⑷萜鲀?nèi)部實現(xiàn)與遍歷操作隔離、解耦。
使用迭代器實現(xiàn)一個簡單集合通過自定義一個簡單集合,并在對其使用迭代器進(jìn)行遍歷,達(dá)到掌握迭代器的目的。
集合描述一個簡單的集合,規(guī)則如下
1、只能存放三個字符串
2、若插入第四個數(shù)據(jù),則覆蓋第一個位置。
實現(xiàn)接口描述 Iterable接口描述如果想用foreach對集合遍歷,則必須實現(xiàn)該接口。(具體原因在后面說明)
iterator():是必須實現(xiàn)的接口,返回了一個迭代器。
Iterator迭代器,可以對已知集合進(jìn)行遍歷操作。
hasNext():必須實現(xiàn),返回一個boolean表示是否有下一個值
next():必須實現(xiàn),從集合中返回下一個元素。
代碼實現(xiàn) 自定義集合/** * 自定義集合 * 功能: 只能插入三個元素, 插入第四個元素會替換集合中第一個元素 * 實現(xiàn)了Iterable(可迭代)接口,必須要實現(xiàn)其中的iterator方法,返回一個迭代器 **/ public class MyCollection implements Iterable自定義迭代器{ String value1; String value2; String value3; int currentValueIndex = 1; public String get(int index) { switch (index) { case 1: return value1; case 2: return value2; case 3: return value3; default: return null; } } /** * 添加一個元素, currentValueIndex為當(dāng)前元素索引, 表示下一次插入的位置 * 維護(hù)了一個只可以插入三個String的集合 * @param value * @return */ public boolean add(String value) { switch (currentValueIndex) { case 1: value1 = value; currentValueIndex++; break; case 2: value2 = value; currentValueIndex++; break; case 3: value3 = value; currentValueIndex-=2; break; default: break; } return true; } /** * 返回我們自己定義的集合迭代器 * @return */ @Override public Iterator iterator() { return new MyCollectionIterator(this); } }
自定義了一個迭代器,可以對上面自定義集合進(jìn)行遍歷。
/** * 給我自己實現(xiàn)的集合實現(xiàn)一個迭代器 * 必須實現(xiàn)的方法 * hasNext是否有下一個元素 * next取出下一個元素 */ public class MyCollectionIterator implements Iterator測試方法{ int index = 1; int maxIndex = 3; MyCollection myCollection; public MyCollectionIterator(MyCollection myCollection) { this.myCollection = myCollection; } /** * 如果當(dāng)前指針已經(jīng)指向3,就沒有下一個了,返回false * 否則還有下一個 * @return */ @Override public boolean hasNext() { if (index > maxIndex) { return false; } return true; } /** * 取出下一個元素,指針向前移動一步 * @return */ @Override public String next() { String result = myCollection.get(index); index ++; return result; } }
public class Test { public static void main(String[] args) { MyCollection collection = new MyCollection(); collection.add("test1"); collection.add("test2"); collection.add("test3"); /** * 循環(huán)1,獲取MyCollection的迭代器, 用while和next、hasNext遍歷我們的自定義集合 */ Iterator測試代碼反編譯結(jié)果iterator = collection.iterator(); while (iterator.hasNext()) { String str = iterator.next(); System.out.println(str); } /** * 循環(huán)2,因為我們的集合實現(xiàn)了Iterable接口,因此可以使用forEach循環(huán) * 但是foreach循環(huán)編譯的結(jié)果是和循環(huán)1一模一樣的代碼 */ for (String s : collection) { System.out.println(s); } } }
這里是上述測試代碼反編譯后的代碼,可以看到,上面的循環(huán)2(foreach),已經(jīng)被編譯成了和循環(huán)1一樣的結(jié)構(gòu)。這里可以看出,foreach循環(huán)最終其實是會使用iterator()方法獲取迭代器,來完成遍歷。因此如果想使用foreach循環(huán),則必須實現(xiàn)Iterable接口。
public class Test { public Test() { } public static void main(String[] args) { MyCollection collection = new MyCollection(); collection.add("test1"); collection.add("test2"); collection.add("test3"); Iterator iterator = collection.iterator(); while(iterator.hasNext()) { String str = (String)iterator.next(); System.out.println(str); } Iterator var5 = collection.iterator(); while(var5.hasNext()) { String s = (String)var5.next(); System.out.println(s); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74289.html
摘要:理解迭代對象迭代器生成器后端掘金本文源自作者的一篇博文,原文是,俺寫的這篇文章是按照自己的理解做的參考翻譯。比較的是兩個對象的內(nèi)容是后端掘金黑魔法之協(xié)程異步后端掘金本文為作者原創(chuàng),轉(zhuǎn)載請先與作者聯(lián)系。 完全理解關(guān)鍵字with與上下文管理器 - 掘金如果你有閱讀源碼的習(xí)慣,可能會看到一些優(yōu)秀的代碼經(jīng)常出現(xiàn)帶有 with 關(guān)鍵字的語句,它通常用在什么場景呢?今天就來說說 with 和 上下...
摘要:前言本篇主要講解中的機(jī)制和網(wǎng)絡(luò)通訊中處理高并發(fā)的分為兩塊第一塊講解多線程下的機(jī)制第二塊講解如何在機(jī)制下優(yōu)化資源的浪費(fèi)服務(wù)器單線程下的機(jī)制就不用我介紹了,不懂得可以去查閱下資料那么多線程下,如果進(jìn)行套接字的使用呢我們使用最簡單的服務(wù)器來幫助大 前言 本篇主要講解Java中的IO機(jī)制和網(wǎng)絡(luò)通訊中處理高并發(fā)的NIO 分為兩塊:第一塊講解多線程下的IO機(jī)制第二塊講解如何在IO機(jī)制下優(yōu)化CPU資...
摘要:探索專為而設(shè)計的將探討進(jìn)行了何種改進(jìn),以及這些改進(jìn)背后的原因。關(guān)于最友好的文章進(jìn)階前言之前就寫過一篇關(guān)于最友好的文章反響很不錯,由于那篇文章的定位就是簡單友好,因此盡可能的摒棄復(fù)雜的概念,只抓住關(guān)鍵的東西來講,以保證大家都能看懂。 周月切換日歷 一個可以進(jìn)行周月切換的日歷,左右滑動的切換月份,上下滑動可以進(jìn)行周,月不同的視圖切換,可以進(jìn)行事件的標(biāo)記,以及節(jié)假日的顯示,功能豐富 Andr...
摘要:簡單介紹下規(guī)范里面迭代器相關(guān)的概念。接口指定迭代器對象必須實現(xiàn)一個方法,如下示例偽代碼。方法是否接受參數(shù),在規(guī)范中并不嚴(yán)格限定,取決于實現(xiàn)當(dāng)前這個迭代器的對象。表示迭代終結(jié),后續(xù)再調(diào)用當(dāng)前迭代器的方法,返回的對象一律為。 簡單介紹下 ES6 規(guī)范里面迭代器(Iterator)相關(guān)的概念。最近為啥會看到迭代器,是因為看了 fetch 相關(guān)的 Headers 接口,為了實現(xiàn)下 Header...
摘要:比如,第一張圖中,如果傳入的參數(shù)為,那就可以找出所有為的數(shù)據(jù)了,放入迭代器里。每次小的遍歷結(jié)束是,迭代器,表示繼續(xù)訪問迭代器中的下一行。 上一章我們學(xué)習(xí)了對智能合約開發(fā)來說至關(guān)重要的第一步: 知道了RAM、multi_index和EOS數(shù)據(jù)庫各是什么以及它們之間的關(guān)系; 知道了multi_index是內(nèi)存數(shù)據(jù)庫的入口; 了解了multi_index內(nèi)部的結(jié)構(gòu)長什么樣子; 今天這...
閱讀 2658·2021-11-25 09:43
閱讀 678·2021-11-12 10:36
閱讀 4636·2021-11-08 13:18
閱讀 2184·2021-09-06 15:00
閱讀 3121·2019-08-30 15:56
閱讀 936·2019-08-30 13:57
閱讀 1994·2019-08-30 13:48
閱讀 1422·2019-08-30 11:13