Java集合——Iterable和Iterator接口介绍

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));

版权声明:本文为qq_35258036原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。