[Iterators](http://www.iteblog.com/archives/tag/iterators "查看 Iterators 中的全部文章")類提供了返回Iterator類型的對象或者對Iterator類型對象操作的方法。除了特別的說明,[Iterators](http://www.iteblog.com/archives/tag/iterators "查看 Iterators 中的全部文章")類中所有的方法都在Iterables類中有相應的基于Iterable方法對應。
性能說明:除非特別說明,所有在這個類中的迭代器都是懶惰的,這意味著在覺得必要的時候,需要提前得到迭代功能。
[Iterators](http://www.iteblog.com/archives/tag/iterators "查看 Iterators 中的全部文章")類可以通過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<List> 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源碼。(完)
**轉載請注明: 轉載自[過往記憶(http://www.iteblog.com/)](http://www.iteblog.com/)
本文鏈接地址:?[Guava學習之Iterators(http://www.iteblog.com/archives/693)](http://www.iteblog.com/archives/693)**