<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## [迭代器Iterators](https://lingcoder.gitee.io/onjava8/#/book/12-Collections?id=%e8%bf%ad%e4%bb%a3%e5%99%a8iterators) 在任何集合中,都必須有某種方式可以插入元素并再次獲取它們。畢竟,保存事物是集合最基本的工作。對于**List**,`add()`是插入元素的一種方式,`get()`是獲取元素的一種方式。 如果從更高層次的角度考慮,會發現這里有個缺點:要使用集合,必須對集合的確切類型編程。這一開始可能看起來不是很糟糕,但是考慮下面的情況:如果原本是對**List**編碼的,但是后來發現如果能夠將相同的代碼應用于**Set**會更方便,此時應該怎么做?或者假設想從一開始就編寫一段通用代碼,它不知道或不關心它正在使用什么類型的集合,因此它可以用于不同類型的集合,那么如何才能不重寫代碼就可以應用于不同類型的集合? *迭代器*(也是一種設計模式)的概念實現了這種抽象。迭代器是一個對象,它在一個序列中移動并選擇該序列中的每個對象,而客戶端程序員不知道或不關心該序列的底層結構。另外,迭代器通常被稱為*輕量級對象*(lightweight object):創建它的代價小。因此,經常可以看到一些對迭代器有些奇怪的約束。例如,Java 的**Iterator**只能單向移動。這個**Iterator**只能用來: 1. 使用`iterator()`方法要求集合返回一個**Iterator**。**Iterator**將準備好返回序列中的第一個元素。 2. 使用`next()`方法獲得序列中的下一個元素。 3. 使用`hasNext()`方法檢查序列中是否還有元素。 4. 使用`remove()`方法將迭代器最近返回的那個元素刪除。 為了觀察它的工作方式,這里再次使用[類型信息](https://lingcoder.gitee.io/onjava8/#/)章節中的**Pet**工具: ~~~ // collections/SimpleIteration.java import typeinfo.pets.*; import java.util.*; public class SimpleIteration { public static void main(String[] args) { List<Pet> pets = Pets.list(12); Iterator<Pet> it = pets.iterator(); while(it.hasNext()) { Pet p = it.next(); System.out.print(p.id() + ":" + p + " "); } System.out.println(); // A simpler approach, when possible: for(Pet p : pets) System.out.print(p.id() + ":" + p + " "); System.out.println(); // An Iterator can also remove elements: it = pets.iterator(); for(int i = 0; i < 6; i++) { it.next(); it.remove(); } System.out.println(pets); } } /* Output: 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster [Pug, Manx, Cymric, Rat, EgyptianMau, Hamster] */ ~~~ 有了**Iterator**,就不必再為集合中元素的數量操心了。這是由`hasNext()`和`next()`關心的事情。 如果只是想向前遍歷**List**,并不打算修改**List**對象本身,那么使用*for-in*語法更加簡潔。 **Iterator**還可以刪除由`next()`生成的最后一個元素,這意味著在調用`remove()`之前必須先調用`next()`。\[^4\] 在集合中的每個對象上執行操作,這種思想十分強大,并且貫穿于本書。 現在考慮創建一個`display()`方法,它不必知曉集合的確切類型: ~~~ // collections/CrossCollectionIteration.java import typeinfo.pets.*; import java.util.*; public class CrossCollectionIteration { public static void display(Iterator<Pet> it) { while(it.hasNext()) { Pet p = it.next(); System.out.print(p.id() + ":" + p + " "); } System.out.println(); } public static void main(String[] args) { List<Pet> pets = Pets.list(8); LinkedList<Pet> petsLL = new LinkedList<>(pets); HashSet<Pet> petsHS = new HashSet<>(pets); TreeSet<Pet> petsTS = new TreeSet<>(pets); display(pets.iterator()); display(petsLL.iterator()); display(petsHS.iterator()); display(petsTS.iterator()); } } /* Output: 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat */ ~~~ `display()`方法不包含任何有關它所遍歷的序列的類型信息。這也展示了**Iterator**的真正威力:能夠將遍歷序列的操作與該序列的底層結構分離。出于這個原因,我們有時會說:迭代器統一了對集合的訪問方式。 我們可以使用**Iterable**接口生成上一個示例的更簡潔版本,該接口描述了“可以產生**Iterator**的任何東西”: ~~~ // collections/CrossCollectionIteration2.java import typeinfo.pets.*; import java.util.*; public class CrossCollectionIteration2 { public static void display(Iterable<Pet> ip) { Iterator<Pet> it = ip.iterator(); while(it.hasNext()) { Pet p = it.next(); System.out.print(p.id() + ":" + p + " "); } System.out.println(); } public static void main(String[] args) { List<Pet> pets = Pets.list(8); LinkedList<Pet> petsLL = new LinkedList<>(pets); HashSet<Pet> petsHS = new HashSet<>(pets); TreeSet<Pet> petsTS = new TreeSet<>(pets); display(pets); display(petsLL); display(petsHS); display(petsTS); } } /* Output: 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat */ ~~~ 這里所有的類都是**Iterable**,所以現在對`display()`的調用顯然更簡單。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看