Iterable和Iterator是什么?
Iterable是Collection的实现接口,即是集合的最顶级父类
Iterator用于代替旧的Enumeration,实现集合的统一遍历
前提阅读:设计模式——迭代器模式
Iterable源码
- iterator()方法,用于返回T类型的迭代器
- forEach(Consumer<? super T> action)默认方法,用于遍历所有集合,简化Iterator遍历过程,并不是所有集合都可foreach遍历,故存在默认实现
- spliterator()默认方法不知道
public interface Iterable<T> {
public Iterator<T> iterator();
public default void forEach(Consumer<? super T> action) {
throw new RuntimeException("Stub!");
}
public default Spliterator<T> spliterator() {
throw new RuntimeException("Stub!");
}
}
Iterator源码
在旧的Enumeration中只有hasMoreElements()和nextElement(),而对于Iterator新增了两个默认方法
- hasNext():判断是否存在下一个元素
- next():Iterator位于两个元素之间的间隔,每次调用next()就会越过下一个元素并将其引用返回
- remove():删除上次调用next()时返回的元素,每次调用remove()前需调用next()
- forEachRemaining():不知道
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
使用
对于所有实现了Iterable的类,内部都实现并维护了一个自身的Iterator迭代器(一般为私有内部类),重写其4个方法,将自身的遍历过程包装,并通过iterator()方法返回
Iterable<String> iterable = new ArrayList<>();
Iterator<String> iterator = iterable.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
foreach可与任何实现了Iterable接口的对象一起工作,简化迭代器迭代过程
Iterable<String> iterable = new ArrayList<>();
for (String s : iterable) {
System.out.println(s);
}
在Java8之后,甚至可不用写循环,利用forEachRemaining()并传入Lambda表达式,将对迭代器的每一个元素调用该Lambda表达式
Iterable<String> iterable = new ArrayList<>();
Iterator<String> iterator = iterable.iterator();
iterator.forEachRemaining(s -> System.out.println(s));