初学hadoop程序之---------------Iterable<T>迭代器
来源:互联网 发布:超人电力工程预算软件 编辑:程序博客网 时间:2024/06/16 21:22
Java中迭代器的使用
由于Java中数据容器众多,而对数据容器的操作在很多时候都具有极大的共性,于是Java采用了迭代器为各种容器提供公共的操作接口------说明与具体的数据结构无关。
使用Java的迭代器iterator可以使得对容器的遍历操作完全与其底层相隔离,可以到达极好的解耦效果。
public interface Iterable<T>
Iterator<T>
iterator()
Returns an iterator over a set of elements of type T
Collection接口拓展了接口Iterable,根据以上的对Iterable接口的定义可以发现,其要求实现其的类都提供一个返回迭代器Iterator<T>对象的方法。
迭代器Iterator<T>接口的的定义为:
Interface Iterator<E>
Iterator的三个方法:
boolean
hasNext()
Returns true if the iteration has more elements.E
next()
Returns the next element in the iteration.void
remove()
Removes from the underlying collection the last element returned by the iterator (optional operation).注意:
从以上的定义中可以发现,似乎Iterable()接口和Iterator()接口完全一致,没有任何区别。结合刚刚学习的内部类,可以发现这又是一个支持程序多样化的巧妙设计,充分的支持了多态和解耦。
1、由于所有的Collection类型的对象都被强制要求implements Iterable 接口,故任何Collection对象都要能返回一个能遍历其的迭代器Iterator。如果直接 implement iterator接口, Collection会直接要求具有hasNext()等方法。但是这种方法不具备多态性,即设定好了该如何执行hasNext()等操作,而且程序会显得十分的臃肿和复杂。但是如果采用实施Iterable()接口和返回Iterator对象的方式,则会全然的不同,只要能够返回Iterator对象,完全可以自己的需要进行遍历方式上的自由定义。(即针对同一个接口,在其实现类中提供多样、不同的方法)。
Example:
从以上的例子中可以发现,为了实现对ScanAppleStore类对象的遍历,共定义了两种迭代器供选择:
1、public Iterator<String> iterator() :该迭代器被定义为ScanAppleStore implements Iterable接口的方法, 采用常规的顺序遍历方式,for(String str:appleTree) 时自动被转型调用。
2、public Iterable<String> reverseIterator():该迭代器采用了匿名内部类的方式实现Iterable接口,并返回Iterable对象,采用逆序的遍历方式,for(String str:appleTree.reverseIterator())时,通过调用appleTree.reverseIterator()方法返回Iterable对象。
!foreach语法的标准形式为:for(T element : Iterable<T> elements)
由于Iterable接口要求实现iterator()方法,iterator()方法要求返回Iterator对象,Iterator定义了hasNext(), next(), remove()三种必须被实现的方法。
故实现Iterable的稍显拖沓和复杂:
Example:
此处采用了匿名内部类的方式,结构十分的清晰,此处更是体现出了内部类对于实现接口,强化OOP Java编程能力的重要性。
注意Iterable<T>中强调使用范型,故在定义的时候一定要注意指明类型。
迭代器接口要求实现其的类必须提供三种方法:
hasNext()
:遍历过程中,判定是否还有下一个元素。(从Collection对象的第一个元素开始)
next()
: 遍历该元素。(即取出下一个元素)remove(): 移除刚刚遍历过的元素。
从定义可以发现,该三个方法经常是被搭配使用的。
Examle:
Iteraotr it= arrayList.Iterator();
while(it.hasNext())
{
print(it.next());
it.remove();
}
基本思路为:在遍历下一个元素前,先判断其是否存在。对于想删除的元素,必须先遍历其,故 remove()方法总是接在 next()方法之后。
注:本文来源:http://www.cnblogs.com/airwindow/archive/2012/06/25/2560811.html
- 初学hadoop程序之---------------Iterable<T>迭代器
- 初学hadoop程序之---------------Iterable<T>迭代器
- hadoop初学之--------程序格式
- hadoop初学之WordCount程序一步一步运行
- 初学Hadoop之HDFS
- 初学Hadoop之MapReduce
- Iterable 迭代器
- Java源码解析 Iterable<T>
- Iterable<T>和Iterator<E>
- c++之初学程序
- 初学Hadoop之安装配置Hadoop
- 初学T-SQL笔记之 ON [PRIMARY]
- 初学T-SQL笔记之ON[PRIMARY]
- 初学T-SQL笔记之 ON PRIMARY
- 初学c++之template <typename T>
- JDK之Iterable
- hadoop初学之MapReduce编程模型学习
- hadoop初学之--------GenericOptionsParser解析器
- Hive 优化[笔记5]
- 注释的艺术
- hdu1160 FatMouse's Speed (子序列
- 阅读PDF护眼模式颜色设置
- HDU
- 初学hadoop程序之---------------Iterable<T>迭代器
- JS的变量声明
- 关于RxJava最友好的文章——背压(Backpressure)
- 发工资了
- 简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
- python3.5+selenium3.4自动化测试9_selenium框架2.0-unittest(上)
- go select用法
- vb.net 教程 12-5 webbrowser 与窗体交互3
- poj1986 lca(tarjan算法)