日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java PageUtil + stream 手动计算List 分页

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:
第一個數為開始位置,第二個數為結束位置

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());

通過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 分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。