java8新特性stream流对list进行分页处理
java8新特性stream处理分页
使用场景
开发时遇到有数据不能通过sql进行分页时,可以用stream流中的方法 skip() 和 limit() 进行分页, 用 filter() 进行条件过滤, 用 sorted() 进行排序
关键方法
- skip() 跳过数据
- limit() 取几条
- filter() 过滤
- sorted() 排序
案例代码
/**
* 分页条件查询
* @param taskOpinion 包含相关条件 和分页条件
* @param list 需要进行分页的集合
* @return
*/
private TableDataInfo pageByCondition(TaskOpinion taskOpinion, List<TaskOpinion> list) {
Stream<TaskOpinion> stream = list.stream();
if (StrUtil.isNotBlank(taskOpinion.getStatus())) {
// 筛选处理状态
stream = stream.filter(e -> taskOpinion.getStatus().equals(e.getStatus()));
}
if (StrUtil.isNotBlank(taskOpinion.getProjectNumber())) {
// 筛选项目编号
stream = stream.filter(e -> StrUtil.isNotBlank(e.getProjectNumber()) && e.getProjectNumber().contains(taskOpinion.getProjectNumber()));
}
if (StrUtil.isNotBlank(taskOpinion.getProjectName())) {
// 筛选项目名称
stream = stream.filter(e -> StrUtil.isNotBlank(e.getProjectName()) && e.getProjectName().contains(taskOpinion.getProjectName()));
}
if (StrUtil.isNotBlank(taskOpinion.getContent())) {
// 筛选待办内容
stream = stream.filter(e -> e.getContent().contains(taskOpinion.getContent()));
}
// 时间倒序
stream = stream.sorted(Comparator.comparing(TaskOpinion::getCreateTime).reversed());
list = stream.collect(Collectors.toList());
// 处理分页
int total = list.size();
PageDomain pageDomain = TableSupport.buildPageRequest();
list = list.stream().skip((long) pageDomain.getPageSize() * (pageDomain.getPageNum() - 1)).limit(pageDomain.getPageSize()).collect(Collectors.toList());
TableDataInfo tableDataInfo = new TableDataInfo(list, total);
tableDataInfo.setCode(HttpStatus.SUCCESS);
tableDataInfo.setMsg("查询成功");
return tableDataInfo;
}
