最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 中迭代器的使用方法詳解

 更新時(shí)間:2017年09月22日 14:37:04   投稿:lqh  
這篇文章主要介紹了java 中迭代器的使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下

java 中迭代器的使用方法詳解

前言:

 迭代器模式將一個(gè)集合給封裝起來(lái),主要是為用戶(hù)提供了一種遍歷其內(nèi)部元素的方式。迭代器模式有兩個(gè)優(yōu)點(diǎn):①提供給用戶(hù)一個(gè)遍歷的方式,而沒(méi)有暴露其內(nèi)部實(shí)現(xiàn)細(xì)節(jié);②把元素之間游走的責(zé)任交給迭代器,而不是聚合對(duì)象,實(shí)現(xiàn)了用戶(hù)與聚合對(duì)象之間的解耦。

      迭代器模式主要是通過(guò)Iterator接口來(lái)管理一個(gè)聚合對(duì)象的,而用戶(hù)使用的時(shí)候只需要拿到一個(gè)Iterator類(lèi)型的對(duì)象即可完成對(duì)該聚合對(duì)象的遍歷。這里的聚合對(duì)象一般是指ArrayList,LinkedList和底層實(shí)現(xiàn)為數(shù)組等擁有一組相同或相似特性的對(duì)象。通過(guò)迭代器模式對(duì)聚合對(duì)象的遍歷主要是通過(guò)Iterator接口的next(),hasNext()方法進(jìn)行的,這里next()方法將返回當(dāng)前遍歷點(diǎn)的元素值,而hasNext()方法則表征當(dāng)前遍歷點(diǎn)之后還有沒(méi)有元素。Iterator接口中還有一個(gè)remove()方法,該方法將移除當(dāng)前遍歷點(diǎn)的元素。在一般情況下不需要使用該方法,一些特殊的情況可以調(diào)用該方法,如果當(dāng)前聚合對(duì)象的遍歷不支持該操作,那么可以在該方法中跑出UnSupportedOperationException。

      這里我們以如下例子來(lái)對(duì)迭代器模式進(jìn)行說(shuō)明?,F(xiàn)有兩個(gè)餐廳的兩套菜單,一套菜單是使用數(shù)組實(shí)現(xiàn)的,而另外一套菜單是使用ArrayList實(shí)現(xiàn)的。現(xiàn)在由于兩個(gè)餐廳的合并而需要將兩套菜單進(jìn)行整合,由于雙方的廚師都已經(jīng)習(xí)慣了各自的菜單組裝方式,因而都希望各自繼續(xù)維護(hù)各自的菜單樣式。但是,對(duì)于服務(wù)員來(lái)說(shuō),其為顧客提供菜單的時(shí)候則必須根據(jù)兩套菜單進(jìn)行兩種不同方式的處理,這必然會(huì)增加服務(wù)員的工作難度,而且,如果后期有新的餐廳合并進(jìn)來(lái),比如其使用的菜單種類(lèi)為HashMap,那么服務(wù)員將又會(huì)維護(hù)這一套菜單,這也不利于擴(kuò)展。根據(jù)服務(wù)員的需求,其需要的是一個(gè)菜單列表,如果其面向的是各個(gè)不同的菜單類(lèi),那么勢(shì)必會(huì)增加其工作難度,并且各個(gè)不同的菜單類(lèi)中所提供的方法也不一定是服務(wù)員所需要的,因而,根據(jù)服務(wù)員的需求,這里需要制定一個(gè)菜單的規(guī)范,以實(shí)現(xiàn)服務(wù)員能夠按照同一種方式對(duì)其進(jìn)行遍歷。這里就可以使用到迭代器模式,服務(wù)員只需要面向迭代器接口進(jìn)行遍歷,而各個(gè)廚師所擁有的菜單只需要實(shí)現(xiàn)該迭代器即可,其依然可以按照各自的方式維護(hù)其菜單項(xiàng)。這樣就實(shí)現(xiàn)了不同的菜單與服務(wù)員的解耦。以下是使用迭代器模式解決該問(wèn)題的具體代碼。

菜單接口(主要包含創(chuàng)建迭代器的方法):

public interface Menu<T> {
  Iterator<T> createIterator();
}

菜單項(xiàng):

public class MenuItem {
  private String name;
  private String description;
  private boolean vegetarian;
  private double price;

  public MenuItem(String name, String description, boolean vegetarian, double price) {
    this.name = name;
    this.description = description;
    this.vegetarian = vegetarian;
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public String getDescription() {
    return description;
  }

  public boolean isVegetarian() {
    return vegetarian;
  }

  public double getPrice() {
    return price;
  }
}

菜單類(lèi)(菜單項(xiàng)的組裝方式):

public class DinerMenu implements Menu<MenuItem> {
  private static final int MAX_ITEMS = 6;
  private int numberOfItems = 0;
  private MenuItem[] menuItems;

  public DinerMenu() {
    menuItems = new MenuItem[MAX_ITEMS];
    addItem("Vegetarian BLT", "(Fakin') Bacon with lettuce & tomato on whole wheat", true, 2.99);
    addItem("BLT", "Bacon with lettuce & tomato on whole wheat", false, 2.99);
    addItem("Soup of the day", "Soup of the day, with a side of potato salad", false, 3.29);
    addItem("Hotdog", "A hot dog, with saurkraut, relish, onions, topped with cheese", false, 3.05);
  }

  public void addItem(String name, String description, boolean vegetarian, double price) {
    MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
    if (numberOfItems >= MAX_ITEMS) {
      System.out.println("Sorry, menu is full, Can't add item to menu");
    } else {
      menuItems[numberOfItems] = menuItem;
      numberOfItems++;
    }
  }

  @Deprecated
  public MenuItem[] getMenuItems() {
    return menuItems;
  }

  public Iterator<MenuItem> createIterator() {
    return new DinerMenuIterator(menuItems);
  }
}
public class PancakeHouseMenu implements Menu<MenuItem> {
  private ArrayList<MenuItem> menuItems;

  public PancakeHouseMenu() {
    menuItems = new ArrayList<>();
    addItem("K&B's Pancake Breakfast", "Pancakes with scrambled eggs, and toast", true, 2.99);
    addItem("Regular Pancake Breakfast", "Pancakes with fried eggs, sausage", false, 2.99);
    addItem("Blueberry Pancakes", "Pancakes made with fresh blueberries", true, 3.49);
    addItem("Waffles", "Waffles, with your choice of blueberries or strawberries", true, 3.49);
  }

  public void addItem(String name, String description, boolean vegetarian, double price) {
    MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
    menuItems.add(menuItem);
  }

  @Deprecated
  public ArrayList<MenuItem> getMenuItems() {
    return menuItems;
  }

  public Iterator<MenuItem> createIterator() {
    return menuItems.iterator();
  }
}

迭代器接口:

public interface Iterator<T> {
  boolean hasNext();
  T next();
}

迭代器類(lèi):

public class DinerMenuIterator implements Iterator<MenuItem> {
  private MenuItem[] items;
  private int position = 0;

  public DinerMenuIterator(MenuItem[] items) {
    this.items = items;
  }

  @Override
  public boolean hasNext() {
    return position < items.length && items[position] != null;
  }

  @Override
  public MenuItem next() {
    return items[position++];
  }

  @Override
  public void remove() {
    if (position <= 0) {
      throw new IllegalStateException("You can't remove an item until you've done at least one next()");
    }

    if (items[position - 1] != null) {
      for (int i = position - 1; i < items.length - 1; i++) {
        items[i] = items[i + 1];
      }
      items[items.length - 1] = null;
    }
  }
}
public class PancakeHouseIterator implements Iterator<MenuItem> {
  private ArrayList<MenuItem> items;
  private int position = 0;

  public PancakeHouseIterator(ArrayList<MenuItem> items) {
    this.items = items;
  }

  @Override
  public boolean hasNext() {
    return position < items.size();
  }

  @Override
  public MenuItem next() {
    return items.get(position++);
  }
}

服務(wù)員類(lèi):

public class Waitress {
  private Menu<MenuItem> pancakeHouseMenu;
  private Menu<MenuItem> dinerMenu;

  public Waitress(Menu<MenuItem> pancakeHouseMenu, Menu<MenuItem> dinerMenu) {
    this.pancakeHouseMenu = pancakeHouseMenu;
    this.dinerMenu = dinerMenu;
  }

  public void printMenu() {
    Iterator<MenuItem> pancakeIterator = pancakeHouseMenu.createIterator();
    Iterator<MenuItem> dinerIterator = dinerMenu.createIterator();
    System.out.println("MENU\n----\nBREAKFAST");
    printMenu(pancakeIterator);
    System.out.println("\nLUNCH");
    printMenu(dinerIterator);

  }

  private void printMenu(Iterator<MenuItem> iterator) {
    while (iterator.hasNext()) {
      MenuItem menuItem = iterator.next();
      System.out.print(menuItem.getName() + ", ");
      System.out.print(menuItem.getPrice() + " -- ");
      System.out.println(menuItem.getDescription());
    }
  }
}

      從上面的代碼可以看出,服務(wù)員并沒(méi)有針對(duì)具體的菜單進(jìn)行編程,而是依賴(lài)于一個(gè)創(chuàng)建菜單迭代器的Menu接口和一個(gè)迭代器接口Iterator來(lái)進(jìn)行編程的,服務(wù)員并不需要知道所傳過(guò)來(lái)的是何種組裝方式的菜單,而只需要使用實(shí)現(xiàn)這兩個(gè)接口的菜單對(duì)象進(jìn)行遍歷即可,這就達(dá)到了將變化的依賴(lài)于多態(tài)而實(shí)現(xiàn)接口,將不變的依賴(lài)于接口的目的,從而實(shí)現(xiàn)服務(wù)員與菜單組裝方式的分離。

      迭代器模式在Java類(lèi)庫(kù)的集合中隨處可見(jiàn),這里使用的Menu就相當(dāng)于Java類(lèi)庫(kù)中的Iterable接口,其作用是創(chuàng)建一個(gè)迭代器對(duì)象,而Iterator接口和Java類(lèi)庫(kù)的Iterator接口基本一致。這里需要說(shuō)明的是,實(shí)際上讓一個(gè)類(lèi)實(shí)現(xiàn)迭代器模式在為一個(gè)類(lèi)增加功能的同時(shí)也增加了該類(lèi)的維護(hù)負(fù)擔(dān),因?yàn)轭?lèi)的基本方法是高內(nèi)聚的,所謂的內(nèi)聚即是實(shí)現(xiàn)了一套相關(guān)的完整的功能,而迭代器接口實(shí)際上也是一套完整的相關(guān)的功能,因而讓一個(gè)類(lèi)實(shí)現(xiàn)迭代器模式隱含地為這個(gè)類(lèi)增加了兩套不那么“內(nèi)聚”的兩套功能,這就會(huì)導(dǎo)致該類(lèi)在進(jìn)行功能維護(hù)的時(shí)候需要兼顧雙方。在Java類(lèi)庫(kù)中ArrayList和LinkedList中就有體現(xiàn),其不僅提供了List所有的基本的remove方法,也提供了迭代器所需要實(shí)現(xiàn)的remove方法,為了實(shí)現(xiàn)兩者的統(tǒng)一,其不得不作一些約定,比如遍歷集合的時(shí)候不能調(diào)用該類(lèi)基本的remove或者add等會(huì)更改該類(lèi)結(jié)構(gòu)的方法。

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    小編遇到這樣一個(gè)問(wèn)題spring-cloud-starter-feign,spring-cloud-starter-eureka 一直無(wú)法下載,maven倉(cāng)庫(kù)中包路徑顯示為unknown,怎么解決呢?下面小編給大家?guī)?lái)了pom.xml中maven無(wú)法下載springcloud包問(wèn)題,需要的朋友可以參考下
    2022-08-08
  • 詳解Java虛擬機(jī)30個(gè)常用知識(shí)點(diǎn)之1——類(lèi)文件結(jié)構(gòu)

    詳解Java虛擬機(jī)30個(gè)常用知識(shí)點(diǎn)之1——類(lèi)文件結(jié)構(gòu)

    這篇文章主要介紹了Java虛擬機(jī)類(lèi)文件結(jié)構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • springBoot中的properties配置解析

    springBoot中的properties配置解析

    這篇文章主要介紹了springBoot中的properties配置解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么

    詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么

    這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring @Transaction 注解執(zhí)行事務(wù)的流程

    Spring @Transaction 注解執(zhí)行事務(wù)的流程

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開(kāi)啟事務(wù)的?又是如何進(jìn)行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細(xì)介紹,需要的朋友可以參考下
    2021-06-06
  • java中線(xiàn)程中斷的實(shí)現(xiàn)示例

    java中線(xiàn)程中斷的實(shí)現(xiàn)示例

    中斷只是一種協(xié)作協(xié)商機(jī)制,Java沒(méi)有給中斷增加任何語(yǔ)法,中斷的過(guò)程完全需要程序員自己實(shí)現(xiàn),本文就來(lái)介紹一下線(xiàn)程中斷的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)

    這篇文章主要介紹了解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 簡(jiǎn)易JDBC框架實(shí)現(xiàn)過(guò)程詳解

    簡(jiǎn)易JDBC框架實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了簡(jiǎn)易JDBC框架實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 老生常談java路徑中的反斜杠和斜杠的區(qū)別

    老生常談java路徑中的反斜杠和斜杠的區(qū)別

    下面小編就為大家?guī)?lái)一篇老生常談java路徑中的反斜杠和斜杠的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • IDEA中WebService生成Java代碼并調(diào)用外部接口實(shí)現(xiàn)代碼

    IDEA中WebService生成Java代碼并調(diào)用外部接口實(shí)現(xiàn)代碼

    這篇文章主要介紹了IDEA中WebService生成Java代碼并調(diào)用外部接口實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

甘泉县| 临洮县| 筠连县| 安阳市| 鄂尔多斯市| 灵宝市| 来安县| 大兴区| 仙游县| 南岸区| 若羌县| 云浮市| 饶阳县| 商城县| 乐山市| 伊金霍洛旗| 师宗县| 泾阳县| 富川| 松滋市| 丹寨县| 凤翔县| 鄂温| 萝北县| 长兴县| 浦江县| 卫辉市| 启东市| 集安市| 农安县| 英超| 千阳县| 绵竹市| 永顺县| 泰安市| 扎囊县| 大渡口区| 比如县| 博白县| 沙雅县| 托克逊县|