这一章节我们来说一下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之间的关系。
这一章节就到这里,谢谢。
-----------------------------------