java PageUtil + stream 手动计算List 分页
生活随笔
收集整理的這篇文章主要介紹了
java PageUtil + stream 手动计算List 分页
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
交代一下前言,數據是redis中查詢
140,193,88,117 格式大概是這樣。 需要切割為long類型的list數組。需要手動計算分頁,去mongodb中查詢數據。?
這里我用的手動計算分頁的是?hutool?工具包
import cn.hutool.core.util.PageUtil; 里面挺多實用的工具 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId> </dependency> int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);傳入頁碼,和數據條數,計算數據起始位置
?將頁數和每頁條目數轉換為開始位置和結束位置 此方法用于包括結束位置的分頁方法 例如:
?? ? ? 頁碼:0,每頁10 =》 [0, 10]
?? ? ? 頁碼:1,每頁10 =》 [10, 20]
?? ? ? ……
?? ? ??
當setFirstPageNo(int)設置為1時:
?? ? ? 頁碼:1,每頁10 =》 [0, 10]
?? ? ? 頁碼:2,每頁10 =》 [10, 20]
?? ? ? ……
? ? ??
Params:
pageNo – 頁碼(從0計數)
pageSize – 每頁條目數
Returns:
第一個數為開始位置,第二個數為結束位置
通過工具返回起始頁碼。
//根據起點, 和 終點, 截取到中間的vid 查詢List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());通過stream?流。搭配分頁工具。?實現手動分頁。?.map(Long::valueOf)?將string?轉為Long?類型
collect(Collectors.toList()); 收集到分頁之后的數據。如果起始位置超出list集合的size 不為報錯。結束位置超出list的size 不會出錯。 但是size為0 。 if (vids.size() > 0) { 判斷一下。進行下面的步驟。其實羅里吧嗦一大堆,代碼就兩行。
// 將頁數和每頁條目數轉換為開始位置和結束位置 此方法用于包括結束位置的分頁方法 例如: 頁碼:0,每頁10 =》 [0, 10]int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);//根據起點, 和 終點, 截取到中間的vid 查詢List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());?這里放一下這個方法的全部代碼吧。
/*** 分頁查詢小視頻列表,按照時間倒序排序 優先查詢推薦的視頻,如果沒有推薦的視頻或已經查詢完成。再查詢默認的** @param userId 用戶id* @param page 第幾頁* @param pageSize 每頁幾條* @return PageInfo<Video>*/@Overridepublic PageInfo<Video> queryVideoList(Long userId, Integer page, Integer pageSize) {//返回的結果集PageInfo<Video> pageInfo = new PageInfo<>();pageInfo.setPageNum(page);pageInfo.setPageSize(pageSize);//小視頻推薦 redis keyString redisKey = RedisKeyUtils.getVIDEOKEY(userId);//redis推薦視頻vid 140,193,88,117, vidString redisValue = redisTemplate.opsForValue().get(redisKey);//如果redis中推薦的視頻id不為空int recommendCount = 0;//如果redis 推薦視頻不為空if (StringUtils.isNotEmpty(redisValue)) {//分割keyList<String> split = StrUtil.split(redisValue, ',');//用于查找默認視頻時,跳過的頁數計算recommendCount = split.size();// 將頁數和每頁條目數轉換為開始位置和結束位置 此方法用于包括結束位置的分頁方法 例如: 頁碼:0,每頁10 =》 [0, 10]int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);//根據起點, 和 終點, 截取到中間的vid 查詢List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());//如果推薦視頻vid 不為空,查詢推薦視頻if (vids.size() > 0) {Query query = Query.query(Criteria.where("vid").in(vids));List<Video> videos = mongoTemplate.find(query, Video.class);pageInfo.setRecords(videos);return pageInfo;}}//解決為了讓默認視頻從0開始,如果之前推薦視頻已經刷到第四頁。這里需要減去4,包裝從0頁往下查詢int totalPage = PageUtil.totalPage(recommendCount, pageSize);//如果推薦視頻為空,或查詢完畢,查詢返回默認的視頻列表PageRequest pageRequest = PageRequest.of(page - totalPage - 1, pageSize,Sort.by(Sort.Order.desc("created")));Query query = new Query();query.with(pageRequest);List<Video> videos = mongoTemplate.find(query, Video.class);pageInfo.setRecords(videos);return pageInfo;}總結
以上是生活随笔為你收集整理的java PageUtil + stream 手动计算List 分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首发骁龙8+的徕卡旗舰!小米12S系列未
- 下一篇: 20年增长100倍 中国汽车出口逼近世界