java iterator 包_java iterator(迭代器)

任何容器类,都必须有某种方式可以插入元素并将它们再次取出,毕竟持有事物是容器最基本的工作,对于List,add()插入fang,get()取出,如果从更高层的角度思考,会发现这里有个确定:要用容器,必须对容器的确切类型编程,这样如果原本是List编码的,但是后来要应用于Set,那么此时该怎么办,是重写通用代码还是如何

迭代器(也是一种设计模式)的概念可用于达成这个目的,迭代器是一个对象,它的工作是遍历并选择序列中 对象,而客服端程序员不必关心或知道该序列的底层结构,此外迭代器通常被称为轻量级对象:创建它的代价很小. 因此经常可以见到对迭代器有些奇怪的限制;例如,Java的Iterator只能单向移动,这个Iterator只能用来:

1)使用方法iterator()要求容器返回一个Iterator. Iterator将准备好返回序列的第一个元素

2)使用next()获得序列中的下一个元素

3)使用hasNext()检查序列中是否还有元素

4)使用remove()将迭代器新近返回的元素删除 (必须先调用next())

packagejava.util;importjava.util.function.Consumer;public interface Iterator{boolean hasNext(); //检查是否有下一个元素

E next(); //返回下一个元素

default void remove() { //移除一个elment

throw new UnsupportedOperationException("remove");

}default void forEachRemaining(Consumer super E>action) {

Objects.requireNonNull(action);while(hasNext())

action.accept(next());

}

}

//: holding/SimpleIteration.java

packageobject;import typeinfo.pets.*;import java.util.*;public classSimpleIteration {public static voidmain(String[] args) {

List pets = Pets.arrayList(12);

Iterator it =pets.iterator();while(it.hasNext()) {

Pet p=it.next();

System.out.print(p.id()+ ":" + p + " ");

}

System.out.println();//A simpler approach, when possible:

for(Pet p : pets)

System.out.print(p.id()+ ":" + p + " ");

System.out.println();//An Iterator can also remove elements:

it =pets.iterator();for(int i = 0; i < 6; i++) {

it.next();

it.remove();

}

System.out.println(pets);

}

}/*Output:

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster

[Pug, Manx, Cymric, Rat, EgyptianMau, Hamster]*///:~

接受对象容器并传递它,从而在每个对象上都执行操作,这种思想十分强大,现在创建一个display()方法,它不必知道容器的确切类型,清注意diplay()不包含任何有关它所遍历的序列的类型信息,而这也展示了Iterator的真正威力: 能够将遍历序列的操作与序列底层的结构分离,正由于此,我们有时会说,迭代器统一了对容器的访问方式

//: holding/CrossContainerIteration.java

packageobject;import typeinfo.pets.*;import java.util.*;public classCrossContainerIteration {public static void display(Iteratorit) {while(it.hasNext()) {

Pet p=it.next();

System.out.print(p.id()+ ":" + p + " ");

}

System.out.println();

}public static voidmain(String[] args) {

ArrayList pets = Pets.arrayList(8);

LinkedList petsLL = new LinkedList(pets);

HashSet petsHS = new HashSet(pets);

TreeSet petsTS = new TreeSet(pets);

display(pets.iterator());

display(petsLL.iterator());

display(petsHS.iterator());

display(petsTS.iterator());

}

}/*Output:

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat

5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat*///:~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值