package com.company;
import java.util.Iterator;
import java.util.List;
/**
* 第三题
* 将下面这个未完成的Java工具类补充完成,实现懒加载的功能,该类需要实现Iterable接口,能够遍历所有数据。具体要求如下:
* 工具类提供了一个ValueLoader接口,用于获取数据,其中ValueLoader的接口定义为:public interface ValueLoader<T> { List<T> load(long offset, int limit); }。使用该工具类的地方,需要提供ValueLoader的实现类。
* 工具类需要支持懒加载,即遍历时按需获取数据,而非一次性获取所有数据到内存之后,再进行遍历;
* 工具类需要实现Iterable接口,支持使用foreach语句遍历所有数据;
* 当ValueLoader.load()方法返回null时,认为已经遍历完成;
* @param <T>
*/
public class LazyIterator<T> implements Iterable<T> {
private final ValueLoader valueLoader;
//当前数据
private List<T> currentData;
//是否有更多数据
private boolean hasMoreData;
//开始位置
private long offset;
@Override
public Iterator<T> iterator() {
return new Itr();
}
public LazyIterator(ValueLoader valueLoader){
this.valueLoader=valueLoader;
//创建迭代器的时候 就加载数据
loadData();
}
private class Itr implements Iterator<T>{
@Override
public boolean hasNext() {
//如果当前有数据 那么就能继续遍历 如果没有数据 直接返回false
return hasMoreData || currentData.size()>0;
}
@Override
public T next() {
if(!hasNext()){
throw new IllegalStateException("当前已经没有数据了");
}
//如果当前没有数据 但是可以继续加载数据 那么从新加载一遍数据
if(currentData.size()==0){
loadData();
}
//返回当前集合的第一个位置的数据 因为限制的是一条 所以这里直接get(0)
return currentData.get(0);
}
}
//加载数据
private void loadData(){
//限制1条数据 遍历时按需获取数据
List<T>data=valueLoader.load(offset,1);
if(data==null){
//已经遍历完毕了
hasMoreData=false;
}else {
//更新当前的数据
currentData=data;
//开始位置移动
offset+=1;
hasMoreData=true;
}
}
}
import java.util.List;
public interface ValueLoader<T> {
List<T> load(long offset, long limit);
}
public class Test {
private static int count=3;
public static void main(String[] args) {
ValueLoader valueLoader=new ValueLoader() {
@Override
public List load(long offset, long limit) {
System.out.println(offset+"==="+limit);
//模拟假数据
List<Integer>list=new ArrayList<>();
list.add(3);
return list;
}
};
LazyIterator<Integer>lazyIterator=new LazyIterator<>(valueLoader);
for (Integer integer : lazyIterator) {
//实现具体的业务逻辑
System.out.println(integer);
count--;
if(count<=0){
return;
}
}
}
}