博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava Collections API学习之Iterators
阅读量:4150 次
发布时间:2019-05-25

本文共 3121 字,大约阅读时间需要 10 分钟。

 

类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法。除了特别的说明,类中所有的方法都在Iterables类中有相应的基于Iterable方法对应。

  性能说明:除非特别说明,所有在这个类中的迭代器都是懒惰的,这意味着在觉得必要的时候,需要提前得到迭代功能。
类可以通过emptyIterator()方法得到一个空的并且不可改变的List迭代器(EMPTY_LIST_ITERATOR);如下:

 

UnmodifiableListIterator 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");

 输出结果如下:

falsefalseException 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
wyp = Splitter.on(",").split("w,y,p,h,a");Iterator
iterator = wyp.iterator();UnmodifiableIterator
> 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://iplti.baihongyu.com/

你可能感兴趣的文章
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
内存分配的形式有哪些? C++
查看>>
什么是内存泄露,如何避免内存泄露 C++
查看>>
栈和堆的空间大小 C++
查看>>
什么是缓冲区溢出 C++
查看>>
sizeof C++
查看>>
使用指针有哪些好处? C++
查看>>
引用还是指针?
查看>>
checkio-non unique elements
查看>>
checkio-medium
查看>>
checkio-house password
查看>>
checkio-moore neighbourhood
查看>>
checkio-the most wanted letter
查看>>