场景描述:在使用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获取总的页数。