将下面这个未完成的Java工具类补充完成,实现懒加载的功能,该类需要实现Iterable接口,能够遍历所有数据。具体要求如下:
工具类提供了一个ValueLoader接口,用于获取数据,其中ValueLoader的接口定义为:public interface ValueLoader { List load(long offset, int limit); }。使用该工具类的地方,需要提供ValueLoader的实现类。
工具类需要支持懒加载,即遍历时按需获取数据,而非一次性获取所有数据到内存之后,再进行遍历;
工具类需要实现Iterable接口,支持使用foreach语句遍历所有数据;
当ValueLoader.load()方法返回null时,认为已经遍历完成;
待补充完整的工具类:
实际场景使用该类的范例
解答:
补充完整后的LazyIterator
import java.util.Iterator;import java.util.List;public class LazyIterator<T> implements Iterable<T> {private final ValueLoader<T> valueLoader;private List<T> data;private long offset;private int limit;private Iterator<T> iterator;@Overridepublic Iterator<T> iterator() {if (iterator == null) {loadData();}return iterator;}public LazyIterator(ValueLoader<T> valueLoader) {this.valueLoader = valueLoader;this.offset = 0;this.limit = Integer.MAX_VALUE; // 设置初始限制为Integer最大值,加载所有数据this.iterator = new Itr();}private void loadData() {data = valueLoader.load(offset, limit);if (data == null) {// 数据加载完毕,设置迭代器为false,表示遍历完成iterator = null;} else {iterator = data.iterator();}}private class Itr implements Iterator<T> {@Overridepublic boolean hasNext() {if (data == null) {loadData(); // 加载数据}return iterator.hasNext();}@Overridepublic T next() {if (data == null) {loadData(); // 加载数据}return iterator.next();}}}public interface ValueLoader<T> { List<T> load(long offset,int limit);}