对list集合分页的工具类
先查询出全部,对集合进行任意操作,再分页展示,用于特殊场景要求,数据量较大时不适用
import com.github.pagehelper.PageInfo;
import lombok.Data;
import java.util.List;
/**
* 集合分页工具类
* @param <T> 动态类型
*/
@Data
public class ListSub<T> {
//当前页面
private int page = 1;
//显示多少行
private int rows = 10;
//总记录条数
private int total;
public ListSub(int page, int rows) {
this.page = page;
this.rows = rows;
}
public ListSub() {
}
/**
* 对list集合进行分页处理
* @return 分页后的List<T>对象
*/
public List<T> ListSplit(List<T> list) {
return list.subList(rows * (page - 1), ((rows * page) > list.size() ? list.size() : (rows * page)));
}
/**
* 集合分页方法
* @param list 待处理集合
* @param pageNum 页码
* @param pageSize 每页展示数
* @return PageInfo<T>信息
*/
public PageInfo<T> page(List<T> list, Integer pageNum, Integer pageSize) {
pageNum = pageNum < 1 ? 1 : pageNum;
pageNum = pageNum > list.size() / pageSize + 1 ? list.size() / pageSize + 1 : pageNum;
pageSize = pageSize == null ? list.size() : pageSize;
PageInfo<T> pageInfo = new PageInfo<>(new ListSub(pageNum, pageSize).ListSplit(list));
pageInfo.setTotal(list.size());
return pageInfo;
}
}
调用示例——查询数据后构建树结构目录
public PageInfo serverList(String serverName, Integer pageSize, Integer pageNum, String serverType,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startPublishTime,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endPublishTime, String publisherName, String distinguish, LoginUser loginUser) {
//正常查
List<SysServer> sysServers = sysServerMapper.selectSysServerServerByNames(serverName, serverType, startPublishTime, endPublishTime, publisherName, distinguish);
//查全部
List<SysServer> sysServerList = sysServerMapper.selectSysServerServerByNames(null, null, null, null, null, null);
List<HashMap<String, Object>> sysTableList = sysServerMapper.serverSysTable();
for (SysServer sysServer : sysServers) {
String otherParameters = sysServer.getOtherParameters();
if (StringUtils.isNotEmpty(otherParameters) && otherParameters.contains("tableName")) {
Map<String, String> parse = (Map<String, String>) JSONObject.parse(otherParameters);
sysServer.setOtherParameters(parse.get("tableName"));
sysServer.setSysTableList(sysTableList);
}
}
List<SysServer> menuTree = new ArrayList<>();
menuTree.addAll(sysServers);
//找所有相关父节点
for (SysServer sysServer : sysServers) {
menuTree.addAll(getParent(sysServer, sysServerList));
menuTree.addAll(getChildren(sysServer, sysServerList));
}
//去重
menuTree = menuTree.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(SysServer::getServerId))), ArrayList::new));
//构建树
menuTree = buildMenuTree(menuTree, 0);
//排序树
Collections.sort(menuTree);
//集合分页
return new ListSub<SysServer>().page(menuTree, pageNum, pageSize);
}
/**
* 查询该服务所有的父节点(后台)
* @param sysServer 待查询父节点的服务
* @return 返回父集合
*/
public List<SysServer> getParent(SysServer sysServer, List<SysServer> sysServerList) {
List<SysServer> menuTree = new ArrayList<>();
if (sysServer == null || sysServerList == null || sysServer.getParentId() == null || sysServer.getParentId() == 0) {
return menuTree;
}
for (SysServer server : sysServerList) {
if (server.getServerId().equals(sysServer.getParentId())) {
menuTree.add(server);
if (server.getParentId() != null && !new Integer(0).equals(server.getParentId())) {
menuTree.addAll(getParent(server, sysServerList));
} else {
break;
}
}
}
return menuTree;
}
/**
* 查询该服务所有的子节点(后台)
* @param sysServer 待查询父节点的服务
* @return 返回父集合
* @author chenyufeng 2022.07.01 10:49
*/
public List<SysServer> getChildren(SysServer sysServer, List<SysServer> sysServerList) {
List<SysServer> menuTree = new ArrayList<>();
//如果是服务就退出本次递归(递归出口)
if (sysServer == null || sysServerList == null || sysServer.getServerId() == null || "C".equals(sysServer.getMenuType())) {
return menuTree;
}
for (SysServer server : sysServerList) {
if (server.getParentId() != null && server.getParentId().equals(sysServer.getServerId())) {
menuTree.add(server);
//如果是目录就继续向下递归查询
if (server.getServerId() != null && "M".equals(sysServer.getMenuType())) {
menuTree.addAll(getChildren(server, sysServerList));
} else {
break;
}
}
}
return menuTree;
}
//快速生成菜单树(后台)
private ArrayList<SysServer> buildMenuTree(List<SysServer> sysServers, int string) {
ArrayList<SysServer> treeList = new ArrayList<>();
sysServers.forEach(menu -> {
if (Objects.equals(string, menu.getParentId())) {
menu.setChildren(buildMenuTree(sysServers, menu.getServerId()));
treeList.add(menu);
}
});
return treeList;
}