Java:有了Iterator,为何还需要Iterable?

一、Iterator简介

直接看源码:

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

可以简单理解为:Iterator是一个接口,实现了Iterator的类可以支持对该类的对象的内部元素进行读,删操作。

二、Iterable简介

直接看源码:

public interface Iterable<T> {
 
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

可以简单理解为,实现了Iterable接口的类可以返回一个Iterator

三、为何需要Iterable?

java.util包下的Collection,都是实现了Iterable,为何要这么麻烦呢?直接实现Iterator,通过hasNext()next()来对数据进行操作不就可以了吗?何必多一步使用Iterable#iterator()呢?

这样的设计其实非常巧妙!如果ArrayList直接实现Iterator,那我们要操作ArrayList就得通过ArrayList的具体对象!伪代码如下:

public class ArrayList<E> implements Iterator<E> {
	boolean hasNext() {
	}

	E next() {
		//return E;
	}
}

public class Test {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		while(list.hasNext()) {
			list.next();
		}
	}
}

上面的代码中,while()循环和ArrayList高度耦合,如果我们不想用ArrayList,我们需要改变的地方非常多!但如果我们改用Iterable

public static void main(String[] args) {
	ArrayList list = new ArrayList();
	Iterator iterator = list.iterator();
	while(iterator.hasNext()) {
		iterator.next();
	}
}

通过实现Iterablewhile循环不再与ArrayList耦合,以后想要改用LinkedList,只需让LinkedList提供iterator即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值