从头认识java-9.13 foreach与迭代器

这一章节我们来说一下foreach与Iterator。

1.例子:

package com.ray.ch09;

import java.util.ArrayList;

public class Test {

	public static void showItems(Iterable<Integer> iterator) {
		for (Integer item : iterator) {
			System.out.println(item);
		}
	}

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add(i);
		}
		showItems(list);
	}

}


上面的例子是不是很熟悉,但是也不尽相同?

因为上面我们只是沿用了foreach,但是增加了Iterable接口这个东西。

在foreach的实现里面,只要实现了Iterable接口的容器,都可以使用foreach,因此, 尽管foreach一般使用在数组里面,但是在大部分容器里面也是可以使用的。

 

我们将上一章节的代码修改一下,形成新的代码:

 

package com.ray.ch09;

import java.util.Iterator;

public class Test {

	public static void showItems(Iterator<Person> iterator) {
		while (iterator.hasNext()) {
			Person person = iterator.next();
			System.out.print(person.getId() + " ");
		}
	}

	public static void showItems(Iterable<Person> iterator) {
		for (Person person : iterator) {
			System.out.println(person.getId());
		}
	}

	public static void main(String[] args) {
		PersonList personList = new PersonList();
		showItems(personList.iterator());
		showItems(personList);
	}

}

class Person {
	private int id = 0;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}

class PersonList implements Iterable<Person> {
	private Person[] persons = new Person[10];

	public PersonList() {
		for (int i = 0; i < persons.length; i++) {
			Person person = new Person();
			person.setId(i);
			persons[i] = person;
		}
	}

	public Iterator<Person> iterator() {
		return new Iterator<Person>() {
			private int index = 0;

			@Override
			public boolean hasNext() {
				return index < persons.length;
			}

			@Override
			public Person next() {
				return persons[index++];
			}

			@Override
			public void remove() {// 以后会展开实现
			}
		};
	}
}

代码基本差不多,只不过在遍历到时候不再是使用Iterable,而是只能使用foreach。

 

注意:上面把数组和实现Iterable接口的类放在一起说,但是如果你当数组实现了Iterable接口,那就有问题了,看下面的代码。

package com.ray.ch09;

import java.util.Arrays;

public class Test {

	public static void showItems(Iterable<Integer> iterator) {
		for (Integer item : iterator) {
			System.out.println(item);
		}
	}

	public static void main(String[] args) {
		Integer[] array = new Integer[10];
		for (int i = 0; i < 10; i++) {
			array[i] = i;
		}
		// showItems(array);//error
		showItems(Arrays.asList(array));
	}

}


如果把数字当成参数传过去,抛异常,只有在数组转成list后,才能使用。

当然, 如果我们接受的参数直接就是数组,那么,又会不一样。

 

package com.ray.ch09;

public class Test {

	public static void showItems(Integer[] items) {
		for (Integer item : items) {
			System.out.println(item);
		}
	}

	public static void main(String[] args) {
		Integer[] array = new Integer[10];
		for (int i = 0; i < 10; i++) {
			array[i] = i;
		}
		showItems(array);
	}

}



总结:这一章节主要讲述了foreach与Iterable之间的关系。


这一章节就到这里,谢谢。

-----------------------------------

目录



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值