首页

关于java在内存中定义RAMPageUtil工具类实现对象数组集合的分页功能(不需要依赖数据库SQL分页实现)

标签:内存分页,RAMPageUtil,缓存分页工具类,数据库分页,复杂SQL分页优化     发布时间:2018-12-28   

一、前言

在一些特殊场景需考虑在内存实现对象数组集合分页功能,如将新旧业务表数据合起来进行分页显示,由于新旧表的结构及关联关系表差异化比较大且复杂度比较高,如新旧逻辑基于同一查询条件合并起来再基于SQL分页(可以实现),嵌套层级过于复杂且不便与后期扩展优化,因此考虑将新旧表基于不同查询接口实现(分别提供可以sql业务逻辑dao接口方法),并将结果集合并在一起后,再通过内存算法根据起始页和页数进行展示。

二、代码示例

import java.lang.reflect.Array;@b@import java.util.ArrayList;@b@import java.util.Arrays;@b@import java.util.Collections;@b@import java.util.List;@b@import java.util.regex.Pattern;@b@import org.apache.commons.lang3.StringUtils;@b@@b@public class RAMPageUtil {@b@	@b@	private  static  int  defaultMaxPageSize=10;@b@ @b@    /**@b@     * 根据传入的数组和页码返回分页后的数组@b@     * @param original 全量数据的数组@b@     * @param pageNum 页码@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的数据@b@     */@b@    public static <T> T[] page(T[] original, int pageNum) {@b@        return page(original,pageNum,defaultMaxPageSize);@b@    }@b@    /**@b@     * 根据传入的数组和页码返回分页后的数组@b@     * @param original 全量数据的数组@b@     * @param pageNum 页码@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的数据@b@     */@b@    public static <T> T[] page(T[] original, String pageNum) {@b@        if(StringUtils.isEmpty(pageNum) && !Pattern.compile("\\d+").matcher(pageNum).matches()) pageNum = "1";@b@        return page(original,Integer.parseInt(pageNum));@b@    }@b@ @b@    /**@b@     * 根据传入的数组和页码返回分页后的数组@b@     * @param original 全量数据的数组@b@     * @param pageNum 页码@b@     * @param pageSize 每页数据条数@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的数据@b@     */@b@    public static <T> T[] page(T[] original, int pageNum, int pageSize) {@b@        if(null==original || original.length == 0) return (T[]) Array.newInstance(original.getClass().getComponentType(), 0);@b@        if (pageNum <= 0) pageNum = 1;@b@        int from = (pageNum - 1) * pageSize;@b@        int to = pageNum * pageSize;@b@        if(to > original.length) to = original.length;@b@        if(from>=original.length || to <= from) return (T[]) Array.newInstance(original.getClass().getComponentType(), 0);@b@        return Arrays.copyOfRange(original, from, to);@b@    }@b@ @b@    /**@b@     * 根据传入的List和页码返回分页后的List@b@     * @param original 全量的List数据@b@     * @param pageNum 页码@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的List@b@     */@b@    public static <T> List<T> page(List<T> original,int pageNum){@b@        return page(original, pageNum,defaultMaxPageSize);@b@    }@b@    /**@b@     * 根据传入的数组和页码返回分页后的数组@b@     * @param original 全量数据的数组@b@     * @param pageNum 页码@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的数据@b@     */@b@    public static <T> List<T> page(List<T> original, String pageNum) {@b@        if(StringUtils.isEmpty(pageNum) && !Pattern.compile("\\d+").matcher(pageNum).matches()) pageNum = "1";@b@        return page(original,Integer.parseInt(pageNum));@b@    }@b@    /**@b@     * 根据传入的List和页码返回分页后的List@b@     * @param original 全量的List数据@b@     * @param pageNum 页码@b@     * @param pageSize 每页数据条数@b@     * @param <T>@b@     * @return 返回分页后的对应页码页面的List@b@     */@b@    public static <T> List<T> page(List<T> original,int pageNum,int pageSize){@b@        List list = new ArrayList<T>();@b@        Collections.addAll(list,page(original.toArray(),pageNum,pageSize));@b@        return list;@b@    }@b@@b@	public static void main(String[] args) {@b@		@b@		List<String> allDatas=Arrays.asList(new String[]{"1","2","3","4","5","6","7","8","9","10"});@b@		//从第2页开始,没有显示4条,预期结果:5,6,8,9@b@		System.out.println(page(allDatas,2,4));@b@		@b@	}@b@@b@}

控制台打印结果

[5, 6, 7, 8]
@b@
  • ◆ 相关内容