1. 程式人生 > >Guava學習之Iterators

Guava學習之Iterators

  類提供了返回Iterator型別的物件或者對Iterator型別物件操作的方法。除了特別的說明,類中所有的方法都在Iterables類中有相應的基於Iterable方法對應。
  效能說明:除非特別說明,所有在這個類中的迭代器都是懶惰的,這意味著在覺得必要的時候,需要提前得到迭代功能。
類可以通過emptyIterator()方法得到一個空的並且不可改變的List迭代器(EMPTY_LIST_ITERATOR);如下:

UnmodifiableListIterator<Object> objectUnmodifiableIterator = (UnmodifiableListIterator)Iterators.emptyIterator();
System.out.println(objectUnmodifiableIterator.hasNext());
System.out.println(objectUnmodifiableIterator.hasPrevious());
//System.out.println(objectUnmodifiableIterator.next());
//System.out.println(objectUnmodifiableIterator.previous());
objectUnmodifiableIterator.add("w");

輸出結果如下:

false
false
Exception in thread "main" java.lang.UnsupportedOperationException
	at com.google.common.collect.UnmodifiableListIterator.add(UnmodifiableListIterator.java:43)
	at fresh.qunar.com.Test.main(Test.java:38)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

  在輸出的結果中丟擲了一個異常,原因是Iterators.emptyIterator()返回的是一個空的並且不可改變的List迭代器,所以當向返回的objectUnmodifiableIterator中add一個元素的時候,丟擲UnsupportedOperationException異常。
  如果需要得到Iterator型別物件的不可改變的(Unmodifiable)副本,可以呼叫Iterators類中的unmodifiableIterator(final Iterator iterator)函式。
  判斷某個物件是否存在Iterator中可以用contains(Iterator< ?> iterator, Object element)實現,如果iterator中存在element,則返回true;否則返回false。
  在Iterator中刪除所有出現在elementsToRemove集合中的資料可以用removeAll(Iterator< ?> removeFrom, Collection< ?> elementsToRemove)方法實現。相反,如果需要儲存出現在elementsToRetain集合中的所有資料,而其他的都刪除可以用retainAll(Iterator< ?> removeFrom, Collection< ?> elementsToRetain)函式實現。
  Iterators類中有partition(Iterator iterator, int size)和 paddedPartition(Iterator iterator, int size)兩個函式,它們都是將iterator中的元素以數量為size分成Iterators.size(iterator) / size + (Iterators.size(iterator) % size == 0 ? 0 : 1)組,唯一的區別是partition當最後一組數量不是size個時,不會補充;而paddedPartition當最後一組數量不是size個時,會填充null,使得最後一組元素數量也為size個。如下:

Iterable<String> wyp = Splitter.on(",").split("w,y,p,h,a");
Iterator<String> iterator = wyp.iterator();
UnmodifiableIterator<List<String>> listUnmodifiableIterator = Iterators.partition(iterator, 3);
while (listUnmodifiableIterator.hasNext()){
     System.out.println(listUnmodifiableIterator.next());
}

輸出的結果為:

[w, y, p]
[h, a]

而如下程式碼:

Iterable wyp = Splitter.on(",").split("w,y,p,h,a");
Iterator iterator = wyp.iterator();
UnmodifiableIterator&lt;List&gt; listUnmodifiableIterator = Iterators.paddedPartition(iterator, 3);
while (listUnmodifiableIterator.hasNext()) {
System.out.println(listUnmodifiableIterator.next());
}

輸出的結果為:

[w, y, p]
[h, a,null]

需要注意的是:partition和paddedPartition函式返回的是iterator的檢視,當listUnmodifiableIterator.hasNext()為false的時候,iterator的位置將移到最後,也就是Iterators.size(iterator)為0。
Iterators類提供了Iterator和Enumeration之間的轉換,函式原型分別為:

public static UnmodifiableIterator forEnumeration(final Enumeration enumeration)
public static Enumeration asEnumeration(final Iterator iterator)

  更多的關於Iterators的實現,請參見Iterators原始碼。(完)

相關推薦

Guava學習Iterators

  類提供了返回Iterator型別的物件或者對Iterator型別物件操作的方法。除了特別的說明,類中所有的方法都在Iterables類中有相應的基於Iterable方法對應。  效能說明:除非特別說明,所有在這個類中的迭代器都是懶惰的,這意味著在覺得必要的時候,需要提前得

Guava學習GraphsExplained

Graphs, Explained Guava的 common.graph 是一個用於建模圖形結構資料的庫,即實體和它們之間的關係。例子包括網頁和超連結;科學家和他們寫的論文;機場和它們之間的路線;以及人們和他們的家庭關係(家譜)。它的目的是提供一種通用的和可擴充套件的語言

Guava學習Preconditions

下面的程式碼,比較了使用Preconditions工具類和不使用的情況,實現同樣的功能。可以看出,前者在異常驗證這塊,精簡了很多程式碼。//import com.google.common.base.P

guava學習——集合類建立的簡化。

   在專案中,集合類的使用非常普遍。經常需要建立很多的集合類。使用guava可以簡化我們的程式碼,不但可以使程式碼看起來更加簡潔,而且更加優雅。   比如:   使用java原生建立一個HashM

集合框架學習Guava Collection

pub ima condition each 回文 base 開發 pri tostring 開源工具包: Guava : Google Collection Apache:Commons Collecton 1.1 Google Collections Guava

Guava學習筆記Joiner ,Strings,Splitter 工具例項

Guava 一.Strings 1.Strings.padEnd方法 //padEnd普全右 String a="12345"; String b=Strings.padEnd(a, 10, 'x'); System.out.println(b); 結果為:1

Guava學習筆記排序

排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。 從實現上說,Ordering例項就是一個特殊的Comparator例項。Ordering把很多基於Comparator的靜

python學習路(四)

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

nodejs學習 安裝

c盤 信息 如果 安裝過程 ima 打開 nodejs https x64 1. 官網找最新適合自己電腦的版本 下載 https://nodejs.org/en/download/ 2.我的是win7 x64選擇了msi的安裝包,安裝過程修改安裝的目標目錄,最好不要

Mysql學習十二:JDBC連接數據庫DriverManager方法

url state 種類 delet rom 條件 管理系 ont into JDBC連接數據庫 ?創建一個以JDBC連接數據庫的程序,包括7個步驟: 1、載入JDBC驅動程序: 在連接數據庫之前。首先要載入想要連接的數據庫的驅動到JVM

AngularJS學習 UI以及邏輯生成

為什麽 內置 下界 ext boot bootstrap 目錄 方法 this 學習《Angular高級編程》理解如下 要求: 創建如下界面,有導航欄,一個Watchlists面板,面板上有個加號button,一句說明“”Use+to creat

Linux學習用戶管理

shell 已過期 useradd 系統 user 影子 所屬組 有用 刪除用戶 /etc/passwd Linux系統將用戶信息保存在文件/etc/passwd中 文件中一行代表一個用戶,所以文件有多少行就代表系統有多少用戶。每一行都被用冒號隔開分成7個字段,我們先了解

VTK學習路——畫畫我的小蘋果

sdn cell 技術 圖形系統 img 實體 旋轉 insert name 數據集主要由描寫敘述數據集幾何形狀的點集數據及構成數據集的單元構成,因此構建數據集的主要任務就是確定點集和構建單元,本演示樣例程序構建了一個蘋果的實體,然後繪制蘋果。演示樣例程序運行的過程例如

Python基礎學習標識符

數字 其他 符號 lin port 分用 xxx rom code 1、合法的Python標識符   Python標識符字符串規則和其他大部分用C編寫的高級語言相似: 第一個字符必須是字母或下劃線(_) 剩下的字符可以是字母和數字或下滑線 大小寫敏感   標識符不能以數

Vue.js學習生命周期

ted eight http 初始 機會 編譯 log console eat 每個 Vue 實例在被創建之前都要經過一系列的初始化過程。例如,實例需要配置數據觀測(data observer)、編譯模版、掛載實例到 DOM ,然後在數據變化時更新 DOM 。在這個過程中

python學習-項目開發目錄規範

使用說明 可執行 程序說明 一行 python學習 規範 功能性 行程 -m 軟件目錄結構規範有什麽好處:  通過規範化,能夠更好的控制軟件結構,讓程序具有更高的可讀性。項目目錄組織結構如下: Foo/         # 項目名 --bin/     # 可執

Linux學習服務器搭建——DNS服務器

環境 back 文件 -a etc http 區域 輸入 正向 DNS服務器其實是域名解析系統,需要的前提條件只是,兩臺虛擬機可以ping同即可,因此可以在基礎網絡配置下單獨聯系,也可以跟著DHCP服務器一起練習,只是我們以前ping的是IP地址,現在變成ping域名(例:

python學習 -- 數據序列化

單獨 get 多次 __main__ print lambda 字典 學習 module json / pickle 數據序列化序列化定義:把變量從內存中變成可存儲或傳輸的過程稱為序列化。反序列化:把變量內容從序列化的對象重新讀到內存裏稱為反序列胡。序列化模塊之--pick

Android 學習逐幀動畫(Frame)

http sta ram override start pub fill creat 代碼 幀動畫就是將一些列圖片。依次播放。利用肉眼的“視覺暫留”的原理,給用戶的感覺是動畫的錯覺,逐幀動畫的原理和早期的電影原理是一樣的。 a:須要定義逐幀動畫,能夠通過代碼定義。也能夠

odoo學習帶出信息

defaults family rom strong ack gin exce height prompt pre.western { font-family: "Courier New", monospace } p { line-height: 120% } a:lin