java分页遍历
-
数据查询模拟,最多返回三页数据
-
public static int cnt = 0; private static List<String> randStr(int start,int size){++cnt;if(cnt > 3){return Collections.emptyList();}else if(cnt ==3){cnt = 0;size -=2;}List<String> ans = new ArrayList<>(size);for(int i=0;i<size;i++){ans.add((start + i) + "_" + UUID.randomUUID().toString());}return ans; }
-
-
实现方式
-
while循环
-
private static void scanByNormal(){int start =0;int size =5;while(true){List<Stirng> list = randStr(start,size);for(String str : list){System.out.println(str);}if(list.size() < size){break;}start += list.size();} }
-
-
迭代器实现
-
//自定义实现一个通用的分页迭代器 public static abstract class MyIterator<T> implements Iterator<T>{private int start = 0;private int size =5;private int currentIndex;private boolean hasMore = true;private List<T> list;public MyIterator(){}@Overridepublic boolean hasNext(){if(list != null && list.size() > currentIndex){return true;}//当前数据已经加载完毕,尝试加载下一批if(!hasMore){return false;}list = load(start,size);if(list == null || list.isEmpty()){//没有加载到数据,结束return false;}if(list.size()<size){//返回条数小于限制条数,表示还有更多的数据可以加载hasMore = false;}currentIndex =0;start += list.size();return true;}@Overridepublic T next(){return list.get(currentIndex++);}public abstract List<T> load(int start,int size); }
-
//实现 private static void scanByIterator(){MyIterator<String> iterator = new MyIterator<String>(){@Overridepublic List<String> load(int start,int size){return randStr(start,size);}};while(iterator.hasNext()){String str=iterator.next();System.out.println(str);} }
-
//在JDK1.8中 public class IteratorTestForJdk18{@FunctionalInterfacepublic interface LoadFunc<T>{List<T> load(int start,int size);}public static class MyIterator<T> implements Iterator<T>{private int start =0;private int size =5;private int currentIndex;private boolean hasMore = true;private List<T> list;private LoadFunc<T> loadFunc;public MyIterator(LoadFunc<T> loadFunc){this.loadFunc = loadFunc;}@Overridepublic boolean hasNext(){if(list != null && list.size() > currentIndex){return true;}//当前数据已经加载完毕,尝试加载下一批if(!hasMore){return false;}list = loadFunc.load(start,size);if(list == null || list.isEmpty()){//没有加载到数据,结束return false;}if(list.size() < size){//返回条数小于限制条数,表示还有更多的数据可以加载hasMore = false;}currentIndex = 0;start += list.size();return true;}@Overridepublic T next(){return list.get(currentIndex++);}} }
-
//在jdk1.8之后, private static void scanByIteratorInJdk8(){new MyIterator<>(IteratorTestForJdk18::randStr).forEachRemaining(System.out::println); }
-
-