Java实现手动分页

场景描述:在使用mybatis-paginator插件对结果集进行分页处理

项目迭代:要求对结果集当中对象的某个字段为0的进行过滤
思考:小明说这个还不简单?于是直接对分页结果集进行过滤

PageBounds pageBounds = getPageBounds(page, limit, null, null);
List<Map<String, Object>> regionList = regionImpl.getRegionByMonthId(month, pageBounds);
// 使用stream流对结果集进行过滤 生成新的结果集
List<Map<String, Object>> filterMap = regionList.stream().filter(i->!i.get("departmentNum").toString().equals(BizConstants.DAYTIME.TIME));
// return result
return ResultUtil.succResult(retMap, filterMap);

注意: 这里使用stream流对集合进行处理会产生一个新的集合 但是被处理的集合不会发生任何变化!
由于没有保留测试类 这里我直接对结果进行展示了
会发现:集合处理的没问题 但是分页信息没了
原因:生成了一个新的集合 只有原来的集合才有分页信息
解决方案:使用Java8提供的removeIf对集合进行过滤

// 这里涉及如何安全删除集合当中的元素问题
regionList.removeIf(i->i.get("departmentNum").toString().equals(BizConstants.DAYTIME.TIME));

插曲:如何安全的删除Java集合当中的元素?
在这里就不卖关子 直接说结果了 具体点击了解更多

for循环会存在不能完全删除的情况
foreach是不安全的 会发生异常Exception in thread “main” java.util.ConcurrentModificationException
使用迭代器iteration是安全的也能删除完全
Java8提供removeIf是安全的也能删除完全

但是 发现集合处理没问题 也有分页信息 但是比如page:1 limit:10就是第一页显示10条数据
但是过滤之后只有不足10条 结果是处理了 但是分页失败!于是只能手动分页了

// 手动分页
 int total = regionList.size();
 int fromIndex = (Integer.valueOf(page)-1)*Integer.valueOf(limit);
 int toIndex = fromIndex + Integer.valueOf(limit);
 if (toIndex > total){
    
    
     toIndex = total;
 }
 if (fromIndex <= total){
    
    
     List<Map<String, Object>> pageList = regionList.subList(fromIndex, toIndex);
     pageList.forEach(System.out::println);
     Map myPageMap = new HashMap(4);
     myPageMap.put("totalCount", total);
     // 这个公式获取对应的page总数
     myPageMap.put("totalPages", (total - 1)/Integer.valueOf(limit) + 1);
     myPageMap.put("items", pageList);
     return ResultUtil.succResult(retMap, myPageMap);
 }
 return ResultUtil.errorCustom(retMap, "0013", "手动分页失败!");

注意这里具体根据自己的前端需要哪些分页信息 对应给她返回就是了 比如我这边前端需要totalCount总条数 totalPages总页数(根据limit会不一样),根据(total - 1)/limit+ 1获取总的页数。

猜你喜欢

转载自blog.csdn.net/blackxc/article/details/107316420