java8新特性stream流对list进行分页处理

java8新特性stream处理分页

使用场景

开发时遇到有数据不能通过sql进行分页时,可以用stream流中的方法 skip() 和 limit() 进行分页, 用 filter() 进行条件过滤, 用 sorted() 进行排序

关键方法

  1. skip() 跳过数据
  2. limit() 取几条
  3. filter() 过滤
  4. 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;
}
经验分享 程序员 微信小程序 职场和发展