将下面这个未完成的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);
}