Java学习笔记-----用来迭代的iterable和iterator

大家好,烦人的我又来了,小白今天已经更了两两篇博客了呀,但是感觉很充实,那么……开始这篇的内容吧

关于迭代,我先举个例子,大家应该都很喜欢玩角色扮演的游戏,那么现在该干什么呢……?
Java是面向对象的设计思想,第一步当然是设计类了,现在我设计一个英雄类 私有的数据是英雄名字、英雄等级和血量:

public class Hero {
	private String name;
	private int level;
	private int blood;
	public Hero(String name,int level,int blood) {
		this.name = name;
		this.level = level;
		this.blood = blood;
	}
//	@Override
	public String toString() {
		return String.format("名称:%s    等级:%d    血量:%d"
				, this.name, this.level, this.blood);
	}
}

还是为了设计方便,我还是重写了一次toString方法。

接下来设计一个list对象来存储英雄,之后设计一个方法来遍历list:

import java.util.*;

public class OperateInterable {
	public static void main(String [] args) {
		List <Hero> list = new ArrayList();
		Hero [] h = {
				new Hero("葛小伦",50,1000),
				new Hero("蔷薇",60,1100),
				new Hero("蕾娜",66,1400)
		};
		for(int i = 0;i < h.length;i++) {
			list.add(h[i]);
		}
		forEach(list);
		
	}
	static void forEach(List <Hero> list) {
		for(Hero h : list) {
			System.out.println(h.toString());
		}
	}
}

输出的结果大家应该也想得到,我就不详细解释了。

但是
(1)假如我现在想遍历一个set对象,那么需要对forEach方法进行重载
(2)要是想遍历一个queue对象,还需要进行重载
具体的代码如下:

static void forEach(Set <Hero> set) {
		for(Hero h : set) {
			System.out.println(h.toString());
		}
	}
	static void forEach(Queue <Hero> queue) {
		for(Hero h : queue) {
			System.out.println(h.toString());
		}
	}

但是,作为一个程序员,你能忍受重复这样的事情发生吗?反正我是忍不了。
那么,我们就要找到一个相对简单的方法,不管输入的对象是什么样的,都能遍历

这就到了iterable和iterator两个接口了。
list、set、queue都是继承接口collection ,JDK5之前collection类里面就有了iterator的定义,

那么我们使用iterator来写一段遍历的通用方法:

static void forEach(Collection <Hero> collection) {
		Iterator <Hero> iterator = collection.iterator();
		Hero hero;
		while(iterator.hasNext()) {
			hero = iterator.next();
			System.out.println(hero.toString());
		}
	}

这里面有几个需要强调的点:

1、根据多态的设计思路,设计传入的是collection类的可迭代(iterator)的类
2、上面说了,collection里面有iterator方法,所以创建iterator对象的时候直接调用
3、iterator.hasnext()方法是用来检查传 进来的对象是不是还有下一个对象,当有的时候返回true,要是没有下一个的话,就返回false
4、循环里面使用iterator.next()得到这个对象

在这里面我就偷点懒,直接使用泛型了,懒得使用对象的扮演(cast)了

那么调试一下:

public static void main(String [] args) {
		List <Hero> list = new ArrayList<>();
		Queue <Hero> queue = new ArrayDeque<>();
		Set <Hero> set = new HashSet<>();
		Hero [] h = {
				new Hero("葛小伦",50,1000),
				new Hero("蔷薇",60,1100),
				new Hero("蕾娜",66,1400)
		};
		for(int i = 0;i < h.length;i++) {
			list.add(h[i]);
			set.add(h[i]);
			queue.add(h[i]);
		}
		forEach(list);  System.out.println();
		forEach(queue);	System.out.println();
		forEach(set);	
	}

执行结果如下:
在这里插入图片描述
三种类型的对象都能进行输出,但是顺序是不太一样的,这个就和三种类型内部存储的方式有关了,至于是为什么,度娘找吧,我也不太清楚。

好了,对于iterator的理解就谈到这了,今天更了两篇博客,真的好开心呐,我会继续努力的,引用我同学的一句话:何为人才,不断学习,不断进步,方成人才。(不知道原话还不是这样的……)
大家,要为了自己美好的明天努力呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值