由于项目某个页面从多方来源展示,无法做到查询数据库并进行分页,且数据量不大,只好用内存分页,奈何天资愚钝,网上找了半天加以改良成适合我的,才总算做好了分页,但是目前的坎又变成了筛选,最终未采取List.subList方式进行分页以及筛选,人生中总是一个接着一个的困难,越过山丘,风景美好
- 先贴上分页模型
public class Page {
private Integer currentPage;//当前页
private int pageSize;//每页显示记录条数
private int totalPage;//总页数
private List<?> dataList;//每页显示的数据
private int star;//开始数据
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List<?> getDataList() {
return dataList;
}
public void setDataList(List<?> dataList) {
this.dataList = dataList;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
}
- 然后controller层接收到的list数据并进行内存分页操作
List<CountryEntity> list = page.getList();
Page Page = new Page();
//查询出的list数据
//刚开始的页面为第一页
if (Page.getCurrentPage() == null) {
Page.setCurrentPage(1);
} else {
Page.setCurrentPage(Page.getCurrentPage());
}
//设置每页数据为十条
Page.setPageSize(count);
//每页的开始数
Page.setStar((Page.getCurrentPage() - 1) * count);
//list的大小
int totalCount = list.size();
//设置总页数
Page.setTotalPage(totalCount % 10 == 0 ? totalCount / 10 : totalCount / 10 + 1);
//对list进行截取
Page.setDataList(list.subList(Page.getStar(),totalCount-Page.getStar()>Page.getPageSize()?Page.getStar()+Page.getPageSize():totalCount));
page.setList((List<CountryEntity>) Page.getDataList());
return ServerResponse.createBySuccess(page);
-
后续筛选待上传…
-
周末搞了两天,夜以继日,越发感觉程序的魅力以及自己的无力。 最终才去Java 8 的Stream流进行分页和筛选,简直是步步为营,慢的我都不能接受了、先贴上代码
Query query = new Query();
PageModel<ApiInfoDto> pageModel = new PageModel();
query.addCriteria(Criteria.where("id").in(apiIds));
query.addCriteria(Criteria.where("i_delete_flag").is(0));
List<ApiEntity> list = mongoTemplate.find(query, ApiEntity.class);
Query query1 = new Query();
query1.addCriteria(Criteria.where("appId").is(appId));
query1.addCriteria(Criteria.where("i_delete_flag").is(0));
List<ApiEntity> list1 = mongoTemplate.find(query1, ApiEntity.class);
list.addAll(list1);
Page page = new Page();
if (page.getCurrentPage() == null) {
page.setCurrentPage(1);
} else {
page.setCurrentPage((start / count) + 1);
}
//设置每页数据为十条
page.setPageSize(count);
//每页的开始数
page.setStar((page.getCurrentPage() - 1) * count);
//list的大小
int totalCount = list.size();
//设置总页数
page.setTotalPage(totalCount % 10 == 0 ? totalCount / 10 : totalCount / 10 + 1);
pageModel.setTotalCount(totalCount);
/*List collect = list.stream().skip(start).limit(count).collect(Collectors.toList());
pageModel.setList(collect);*/
long time = 0;
if (apifilter != null) {
if (apifilter.getCreateTime() != null && EmptyUtil.isNotEmpty(apifilter.getCreateTime().getStartTime())) {
//获取filter选择时间,转化为毫秒值
String startTime = apifilter.getCreateTime().getStartTime();
Calendar startdate = Calendar.getInstance();
try {
startdate.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(startTime));
time = startdate.getTimeInMillis();
} catch (ParseException e) {
e.printStackTrace();
}
}
long finalTime6 = time;
List<ApiEntity> collect = Optional.ofNullable(list)
.orElse(Lists.newArrayList())
.stream()
.filter(entity -> {
if (StringUtils.isNotEmpty(apifilter.getName())) {
return entity.getName().contains(apifilter.getName());
} else {
return true;
}
})
.filter(entity -> {
if (StringUtils.isNotEmpty(apifilter.getDataUrl())) {
return entity.getDataUrl().contains(apifilter.getDataUrl());
} else {
return true;
}
})
.filter(entity -> {
if (StringUtils.isNotEmpty(apifilter.getCreatorName())) {
return entity.getCreatorName().contains(apifilter.getCreatorName());
} else {
return true;
}
})
.filter(entity -> {
if (apifilter.getType() != null) {
return entity.getType().toString().contains(apifilter.getType().toString());
} else {
return true;
}
})
.filter(entity -> {
if (apifilter.getCreateTime() != null && StringUtils.isNotEmpty(apifilter.getCreateTime().getStartTime())) {
return entity.getCreateTime().getTime() >= finalTime6;
} else {
return true;
}
}).skip(start).limit(count).collect(Collectors.toList());
pageModel.setList(EntityUtil.entityListToDtoList(collect, ApiInfoDto.class));
} else {
List collect = list.stream().skip(start).limit(count).collect(Collectors.toList());
pageModel.setList(collect);
}
List<ApiInfoDto> listToDtoList = EntityUtil.entityListToDtoList(pageModel.getList(), ApiInfoDto.class);
pageModel.setList(listToDtoList);
return pageModel;
修改经验:多次途中遇到空指针判断浪费时间,以及filter过滤时开始对知识面的考虑不恰当,if else 写了几十个,浪费时间,最终求助朋友才知String中的Optional良好用法;对象判断一定要考虑全面