POST
Java 的 Iterable 接口使用
Iterable<>
是 Java.lang
包中定义的一个接口,
根据 Java 文档的介绍该接口主要声明了一个Iterator()
方法,该方法返回一个Iterator<>
接口。
那我们接下来看一看Iterator<>
接口主要内容,Iterator<>
接口的 Java 文档里说明
Iterator<>
接口主要声明了三个方法。
hasNext()
next()
remove()
看到这里就很清楚了,实现了Iterator<>
接口的类可以进行迭代遍历,Iterator<>
接口通过对以上3个方法的封装实现了对遍历访问的支持。Java里的集合类都实现了Iterator<>
接口。
一个简单的应用例子。
Student.java - 基本的数据类
package com.daviddong.example.Iterator
public class Student {
private String name;
private int age;
private String gender;
public Student(String name, int age, String male) {
this.name = name;
this.age = age;
this.gender = male;
}
public Student() {
try {
} catch (Exception e) {
//TODO: handle exception
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
MyIterableClass.java - 实现了Iterator接口
package com.daviddong.example.Iterator;
import java.util.ArrayList;
import java.util.Iterator;
public class MyIterableClass implements Iterator {
private ArrayList<Student> am = new ArrayList<>();
private int length;
private int index;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(index<length){
return true;
}
return false;
}
@Override
public Student next() {
// TODO Auto-generated method stub
return am.get(index++);
}
public MyIterableClass(ArrayList<Student> am, int length, int index) {
this.am = am;
this.length = length;
this.index = index;
}
}
APP.java
package com.daviddong.example.Iterator
import java.util.ArrayList;
import java.util.Random;
public class App {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
ArrayList<String> names = new ArrayList<String>();
names.add("男");
names.add("女");
String gender;
for (int i = 0; i < 10; i++) {
int r = new Random().nextInt(100);
gender = names.get(r%2);
Student student = new Student("学生—" +i, (int)(Math.random()*10)+10, gender);
list.add(student);
}
MyIterableClass myClass = new MyIterableClass(list, list.size(), 0);
while (myClass.hasNext()) {
Student stu = myClass.next();
System.out.println(stu.getName() + " 年龄:" + stu.getAge() + " 性别:" + stu.getGender());
}
}
}
运行结果如下。
学生—0 年龄:19 性别:女
学生—1 年龄:11 性别:男
学生—2 年龄:19 性别:女
学生—3 年龄:19 性别:女
学生—4 年龄:18 性别:女
学生—5 年龄:13 性别:男
学生—6 年龄:17 性别:女
学生—7 年龄:19 性别:女
学生—8 年龄:12 性别:男
学生—9 年龄:14 性别:女
有人可能会问,为什么不直接将hasNext()
,next()
方法放在Iterable接口中,其他类直接实现就可以了?
原因是有些集合类可能不止一种遍历方式,实现了 Iterable 的类可以再实现多个 Iterator 内部类,通过返回不同的 Iterator 实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的 Iterator 实现类了。