自制的代码层分页工具

1 篇文章 0 订阅

有时,复杂的多表关连统计分析用sql分页足够折磨人的,因此有了下面的方法,可以把需要统计的数据从数据库单表查出来,在代码层做统计分析,完后用代码分页,效果尚可。

	// 手工对集合进行分页
	public static <T> List<T> page(List<T> ts, Integer pageNo, Integer pageSize) {
		if (DrinStringUtils.isNull(ts, pageNo, pageSize)) {
			return ts;
		}
		int size = ts.size();
		if (pageNo > size) {
			return new ArrayList<>();
		}
		pageNo = pageNo < 1 ? 1 : pageNo;
		int startIndex = (pageNo - 1) * pageSize;
		int endIndex = startIndex + pageSize;
		List<T> pageList = new ArrayList<>();
		for (int i = 0; i < size; i++) {
			if (i >= startIndex && i < endIndex) {
				pageList.add(ts.get(i));
			}
		}
		return pageList;
	}
	

搭配的使用封装类:

public class Page<E, S> implements Serializable {

	private static final long serialVersionUID = 1L;

	private long total = 0;

	private List<E> data;

	public JsonResult toResult() {
		return new JsonResult(this.data, this.total);
	}

	public Page(List<E> list) {
		doPage(list, null, false);
	}

	public Page(List<E> list, Function<E, S> sortFun) {
		doPage(list, sortFun, false);
	}

	public Page(List<E> list, Function<E, S> sortFun, boolean isDesc) {
		doPage(list, sortFun, isDesc);
	}

	public Page(List<E> list, Integer pageNo, Integer pageSize) {
		doPage(list, pageNo, pageSize, null, false);
	}

	public Page(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun) {
		doPage(list, pageNo, pageSize, sortFun, false);
	}

	public Page(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun, boolean isDesc) {
		doPage(list, pageNo, pageSize, sortFun, isDesc);
	}

	public List<E> getData() {
		return data;
	}

	public long getTotal() {
		return total;
	}

	private void doPage(List<E> list, Function<E, S> sortFun, boolean isDesc) {
		HttpServletRequest request = SystemUtils.getRequest();
		if (null == request) {
			doPage(list, null, null, sortFun, false);
			return;
		}
		String pageNo = request.getParameter("pageNo");
		String pageSize = request.getParameter("pageSize");
		if (DrinStringUtils.isNull(pageNo, pageSize)) {
			doPage(list, null, null, sortFun, false);
		} else {
			Integer num = Integer.parseInt(pageNo);
			Integer size = Integer.parseInt(pageSize);
			doPage(list, num, size, sortFun, false);
		}
	}

	private void doPage(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun, boolean isDesc) {
		if (noNeedToPage(list, pageNo, pageSize)) {
			this.total = null != list ? list.size() : 0;
			this.data = null != list ? list : new ArrayList<>();
		} else {
			this.total = list.size();
			// 排个序
			toSortList(list, sortFun, isDesc);
			this.data = DrinListUtils.page(list, pageNo, pageSize);
		}
	}

	private boolean noNeedToPage(List<E> list, Integer pageNo, Integer pageSize) {
		return null == list || list.size() == 0 || null == pageNo || null == pageSize;
	}

	private void toSortList(List<E> list, Function<E, S> sortFun, boolean isDesc) {
		if (null == sortFun) {
			return;
		}
		Class<?> classSort = resolverClass(list, sortFun);
		if (null == classSort) {
			return;
		}
		boolean isInt = classSort.isAssignableFrom(Integer.class);
		boolean isLong = classSort.isAssignableFrom(Long.class);
		boolean isDouble = classSort.isAssignableFrom(Double.class);
		boolean isString = classSort.isAssignableFrom(String.class);
		list.sort((d1, d2) -> {
			Object s1 = null == d1 ? null : sortFun.apply(d1);
			Object s2 = null == d2 ? null : sortFun.apply(d2);

			if (isDesc) {
				if (isInt) {
					s1 = null == s1 ? Integer.MIN_VALUE : s1;
					s2 = null == s2 ? Integer.MIN_VALUE : s2;
				} else if (isLong) {
					s1 = null == s1 ? Long.MIN_VALUE : s1;
					s2 = null == s2 ? Long.MIN_VALUE : s2;
				} else if (isDouble) {
					s1 = null == s1 ? Double.MIN_VALUE : s1;
					s2 = null == s2 ? Double.MIN_VALUE : s2;
				} else if (isString) {
					s1 = null == s1 ? String.valueOf(Long.MIN_VALUE) : s1;
					s2 = null == s2 ? String.valueOf(Long.MIN_VALUE) : s2;
				} else {
					s1 = null == s1 ? Integer.MIN_VALUE : s1;
					s2 = null == s2 ? Integer.MIN_VALUE : s2;
				}
			} else {
				if (isInt) {
					s1 = null == s1 ? Integer.MAX_VALUE : s1;
					s2 = null == s2 ? Integer.MAX_VALUE : s2;
				} else if (isLong) {
					s1 = null == s1 ? Long.MAX_VALUE : s1;
					s2 = null == s2 ? Long.MAX_VALUE : s2;
				} else if (isDouble) {
					s1 = null == s1 ? Double.MAX_VALUE : s1;
					s2 = null == s2 ? Double.MAX_VALUE : s2;
				} else if (isString) {
					s1 = null == s1 ? String.valueOf(Long.MAX_VALUE) : s1;
					s2 = null == s2 ? String.valueOf(Long.MAX_VALUE) : s2;
				} else {
					s1 = null == s1 ? Integer.MAX_VALUE : s1;
					s2 = null == s2 ? Integer.MAX_VALUE : s2;
				}
			}
			if (isInt) {
				Integer i1 = (Integer) s1;
				Integer i2 = (Integer) s2;
				return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
			} else if (isLong) {
				Long i1 = (Long) s1;
				Long i2 = (Long) s2;
				return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
			} else if (isDouble) {
				Double i1 = (Double) s1;
				Double i2 = (Double) s2;
				return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
			} else if (isString) {
				try {
					Long i1 = Long.parseLong((String) s1);
					Long i2 = Long.parseLong((String) s2);
					return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
				} catch (NumberFormatException e) {
					return 0;
				}
			} else {
				Integer i1 = (Integer) s1;
				Integer i2 = (Integer) s2;
				return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
			}
		});
	}

	private Class<?> resolverClass(List<E> list, Function<E, S> sortFun) {
		for (E e : list) {
			S apply = sortFun.apply(e);
			if (null != apply) {
				return apply.getClass();
			}
		}
		return null;
	}

}

使用示例

public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		list.add(6);
		list.add(null);
		list.add(2);
		list.add(null);
		list.add(4);
		Page<Integer, Integer> page1 = new Page<>(list, 1, 3, l -> l, false);
		Page<Integer, Integer> page2 = new Page<>(list, 2, 3, l -> l, false);
		System.out.println("page1.getData()=" + page1.getData());// [1, 2, 4]
		System.out.println("page2.toResult()=" + page2.toResult());// [1, 2, 4]
	}

console:
page1.getData()=[1, 2, 4]
page2.toResult()=JsonResult [code=200, message=操作成功, data=[6, null, null], total=6]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值