Interface Iterator<E>

Thinking in Java 一书写得太好了,忍不住嗖嗖的做笔记….

迭代器存在的必要性:

任何容器类,都必然要有某种方式可以插入元素,然后取出元素。比如说容器类List,add()是插入元素的方法之一,get()是取出元素的方法之一。
从更高的层次来考虑这件事情,会发现当手头的容器类多起来之后,就有些麻烦的事情出来了。本来对List插入取出元素的代码编写了一遍,突然发现如果能够把相同的代码应用于Set,会省很多事。应该怎么办?如何才能不重写代码就可以应用于不同类型的容器?——-迭代器!

迭代器是一个对象,它的工作是遍历并选择序列号中的对象,而客户端程序员不必知道序列底层的结构。迭代器有些奇怪的限制,如Java的Iterator只能单向移动,这个Iterator能用来:
这里写图片描述

使用Iterator,最强大的威力在于,能够将遍历序列操作与序列底层结构分离。这一点很牛逼!

下面是一个实现了懒加载功能的Java工具类,可以遍历所有数据: ```java import java.util.Iterator; public class LazyLoadIterator<T> implements Iterable<T> { private ValueLoader<T> loader; private int limit; private long offset; public LazyLoadIterator(ValueLoader<T> loader, int limit) { this.loader = loader; this.limit = limit; this.offset = 0L; } @Override public Iterator<T> iterator() { return new Iterator<T>() { private T next = null; @Override public boolean hasNext() { if (next == null) { next = loader.load(offset, limit); offset += limit; } return next != null; } @Override public T next() { T result = null; if (hasNext()) { result = next; next = null; } return result; } }; } public interface ValueLoader<T> { T load(long offset, int limit); } } ``` 在使用该工具类时,需要提供一个实现了ValueLoader接口的类,用于获取数据。例如: ```java public class MyValueLoader implements LazyLoadIterator.ValueLoader<String> { private List<String> data; public MyValueLoader(List<String> data) { this.data = data; } @Override public String load(long offset, int limit) { if (offset >= data.size()) { return null; } int end = (int) Math.min(offset + limit, data.size()); List<String> subList = data.subList((int) offset, end); return String.join(",", subList); } } ``` 然后,可以在代码中使用foreach语句遍历数据: ```java List<String> data = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"); MyValueLoader loader = new MyValueLoader(data); LazyLoadIterator<String> lazyIterator = new LazyLoadIterator<>(loader, 3); for (String s : lazyIterator) { System.out.println(s); } ``` 输出结果为: ``` a,b,c d,e,f g,h,i j ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值