Iterator 与 Iterable

1.什么是迭代器

参考迭代器设计模式的原理。


2.分析源码

Iterator:

我们暂时不看default的内容因为java1.8特性default关键字的意义:default关键字的意义,default的意思就是为接口方法提供默认的实现,它的最终目的就是减少子类实现接口的工作量,,如果多个子类实现的某个接口方法,方法体都是一样的,这就会导致后期维护上的困难,如果在接口中定义默认的实现,那么既减少了子类实现的接口的工作量,也为后期的维护提供了方便(只需要更改接口中的默认实现即可)。

import java.util.Objects;
import java.util.function.Consumer;

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:

package java.lang;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

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的接口

为什么这么做??? 其实就是设计模式的思想

个人理解是这样的,是为了让数据处理逻辑和容器内部数据管理进行分离,提供容器内数据安全性。假设容器实现了Iterator接口,那么我们所有通过Iterator接口进行的数据访问修改操作都会直接影响容器内的数据,因为我们访问的数据和容器维护的数据是同一份数据。其实这样做是很不安全的,因为你也不知道用户访问这个数据会做什么操作,那不如让Iterator接口访问数据副本来的安全。这样大家各管各的,互不影响。
 


3.实际运用 

3.1 使用系统默认自带的迭代器,这样在数据访问的时候我们直接传一个迭代器,用户就只能读取不能修改是不是很牛逼。

 

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class IteratorDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("A");
		list.add("B");
		list.add("C");
		Iterator it = list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}	
	}	
}

3.2自己设计

import java.util.Iterator;

public class IteratorTest implements Iterable<String> {
	String[] str = ("And that is how we know the Earth to be banana-shaped.").split(" ");
	
	
	public static void main(String[] args) {
		IteratorTest iteratorTest = new IteratorTest();
		Iterator<String> it = iteratorTest.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

	@Override
	public Iterator<String> iterator() {
		// TODO Auto-generated method stub
		return new Iterator<String>() {
			private int index = 0;
			@Override
			public boolean hasNext() {
				// TODO Auto-generated method stub
				return index < str.length;
			}

			@Override
			public String next() {
				// TODO Auto-generated method stub
				return str[index++];
			}
			@Override
			public void remove() {
				//不会写QAQ
			}
		};
	}
	

}

   


这个系列算个大坑慢慢填上吧QAQ

 

reference:

https://blog.csdn.net/ysj4428/article/details/81297329

https://blog.csdn.net/zhangzhetaojj/article/details/80550309

https://blog.csdn.net/tianjindong0804/article/details/85383376

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值