将下面这个未完成的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; @Override public 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> { @Override public boolean hasNext() { if (data == null) { loadData(); // 加载数据 } return iterator.hasNext(); } @Override public T next() { if (data == null) { loadData(); // 加载数据 } return iterator.next(); } }
}public interface ValueLoader<T> {List<T> load(long offset,int limit);
}