`
李灵晖-raylee
  • 浏览: 135648 次
博客专栏
Group-logo
从头认识java
浏览量:0
文章分类
社区版块
存档分类
最新评论

从头认识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之间的关系。


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

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

目录



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics