欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

Guava学习之Iterators

  Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法。除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable方法对应。
  性能说明:除非特别说明,所有在这个类中的迭代器都是懒惰的,这意味着在觉得必要的时候,需要提前得到迭代功能。
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 iteblog.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源码。(完)

本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【Guava学习之Iterators】(https://www.iteblog.com/archives/693.html)
喜欢 (0)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!