将下面这个未完成的Java工具类补充完成,实现懒加载的功能,该类需要实现Iterable接口,能够遍历所有数据

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;
            }
        }

    }




}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值