[置顶] 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 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源码。(完)
本文链接地址: Guava学习之Iterators(http://www.wypblog.com/archives/693)
[置顶] Guava学习之Iterators的更多相关文章
- [置顶] Guava学习之ArrayListMultimap
ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...
- [置顶] Guava学习之Splitter
Splitter:在Guava官方的解释为:Extracts non-overlapping substrings from an input string, typically by recogni ...
- [置顶] Guava学习之Lists
Lists类主要提供了对List类的子类构造以及操作的静态方法.在Lists类中支持构造ArrayList.LinkedList以及newCopyOnWriteArrayList对象的方法.其中提供了 ...
- [置顶] Guava学习之Immutable集合
Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...
- [置顶] Guava学习之Multimap
相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的.什么意思呢?就是假如我们有 ...
- [置顶]
Docker学习总结(7)——云端基于Docker的微服务与持续交付实践
本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...
- [置顶] 小白学习KM算法详细总结--附上模板题hdu2255
KM算法是基于匈牙利算法求最大或最小权值的完备匹配 关于KM不知道看了多久,每次都不能完全理解,今天花了很久的时间做个总结,归纳以及结合别人的总结给出自己的理解,希望自己以后来看能一目了然,也希望对刚 ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- [置顶] Android学习系列-Android中解析xml(7)
Android学习系列-Android中解析xml(7) 一,概述 1,一个是DOM,它是生成一个树,有了树以后你搜索.查找都可以做. 2,另一种是基于流的,就是解析器从头到尾解析一遍xml文件. ...
随机推荐
- Object lifetime
Object lifetime Temporary object lifetime Storage reuse Access outside of lifetime Every object has ...
- sql中charindex和cast结合使用
1.CHARINDEX函数常常用来在一段字符中搜索字符或者字符串. 语法 CHARINDEX ( expression1 , expression2 [ , start_location ] ) 返回 ...
- IE6不支持<a>标签以外元素的hover的解决方案
IE6以及更低版本的浏览器对“:hover”的支持不理想,对于类似的“p:hover”.“img:hover”.“#header:hover”...,今天给大家介绍一种新的方法,可以完美解决IE6不支 ...
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...
- QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)
QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...
- QString::toLocal8Bit得听QTextCodec::codecForLocale的
这个函数用了这么久,到今天程序出错才发现这个问题...也就是说,必须设置QTextCodec *codec = QTextCodec::codecForName("System") ...
- paip.tree 生成目录树到txt后的折叠查看
paip.tree 生成目录树到txt后的折叠查看 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.ne ...
- iOS学习之NSAttributedString(富文本)
NSAttributedString 叫做富文本,是一种带有属性的字符串,通过它可以轻松的在一个字符串中表现出多种字体.字号.字体大小等各不相同的风格,还可以对段落进行格式化,一般都是对可变富文本(N ...
- c++11 stl atomic_flag 样例
Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 測试环境:Win7 64 bit 编译 ...
- tomcat环境变量的配置(网上摘,全部验证通过)
tomcat环境变量的配置 1.===> 进入bin目录下,双击startup.bat看是否报错.一般肯定会报. 2.===> 右键我的电脑===>高级===>环境变量 ...