背景介绍

在后端开发时,查询结果返回的是list集合,而前端是要分页进行展示,这里就需要进行分页处理,以下介绍两种方法,供参考。 分页,处理好分页的参数:totalCount、pageSize 和 pageNo

1、方法一

拼接 PageData 数据结构所需参数,包括 总数 totalCount 、页码pageNo 、页大小 pageSize 、开始页 beginIndex 和 结束页 endIndex。

/**
* @param result
* @param query
*/
public static <T> PageData listToPageData(List<T> result, Query query) {
	PageData pageData = new PageData();
	if (CollectionUtils.isEmpty(result)) {
		pageData.setTotalCount(0);
		pageData.setPageNo(1);
		pageData.setPageSize(query.getPageSize());
		pageData.setItems(Collections.emptyList());
		return pageData;
	}
	// 分页各参数
	int totalCount = result.size();
	int pageNo = query.getPageNo();
	int pageSize = query.getPageSize();
	int beginIndex = (pageNo - 1) * pageSize;
	int endIndex = pageNo * pageSize - 1;
	// 赋值
	pageData.setTotalCount(totalCount);
	pageData.setPageNo(pageNo);
	pageData.setPageSize(pageSize);
			
	List<T> sublist;
	if (beginIndex >= totalCount) {
		sublist = Collections.emptyList();
	} else if (endIndex < totalCount) {
		sublist = result.subList(beginIndex, endIndex + 1);
	} else {
		sublist = result.subList(beginIndex, totalCount);			
	}
		pageData.setItems(sublist);		
		return pageData;	
	}
2、方法二

利用 java.util.List 的 ==subList== 方法,从0开始,含头不含尾。

// 本质上是返回原来list的从[fromIndex, toIndex)之间的视图
List<T> subList(int fromIndex, int toIndex);
// 若list大小改变,则可以通过clear方法来恢复
list.subList(fromIndex, toIndex).clear();

分页实现的代码如下所示。

 /**
* @param result
* @param query
*/
public static <T> PageData listToPageData(List<T> result, Query query) {
		List<T> data = result.subList(query.getPageSize() * (query.getPageNo() - 1),
		result.size() > query.getPageSize() * query.getPageNo() ?
		query.getPageSize() * query.getPageNo() : result.size());
	PageData pageData = new PageData(data, result.size(), query.getPageNo(), query.getPageSize());
	return pageData;
}

任何对子列表的操作最终都会反映到原列表中,即list的大小可能会变化。