Java 集合實(shí)現(xiàn)分頁(yè)的方法(業(yè)務(wù)代碼實(shí)現(xiàn)分頁(yè))
一、前言
在Java開(kāi)發(fā)中,有些場(chǎng)景比較復(fù)雜,受限制,不好在sql查詢層面實(shí)現(xiàn)分頁(yè),需要在查詢的list結(jié)果后,將list分頁(yè)返回,如何實(shí)現(xiàn)呢?
二、代碼實(shí)現(xiàn)
1、假設(shè)有一個(gè) list集合,元素如下:
ArrayList<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
2、使用 subList 實(shí)現(xiàn)分頁(yè):
/** *@Description: subList 分頁(yè) * <br> 1. 起始位置邊界值處理: 當(dāng)前頁(yè)碼 <= 0 情況處理; 當(dāng)前頁(yè)碼 > 最大頁(yè)碼 情況處理 * <br> 2. 終止位置邊界值處理: 當(dāng)前頁(yè)碼 <= 0 情況處理; 終止位置 <= 總記錄數(shù) 情況處理 * @param pageSize 每頁(yè)顯示的數(shù)量 * @param pageNum 當(dāng)前頁(yè)碼 */ private List<?> subList(ArrayList<?> list, int pageSize, int pageNum) { int count = list.size(); // 總記錄數(shù) // 計(jì)算總頁(yè)數(shù) int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1; // 起始位置 int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize); // 終止位置 int end = pageNum <= 0 ? (pageSize <= count ? pageSize : count) : (pageSize * pageNum <= count ? pageSize * pageNum : count); return list.subList(start, end); }
3、Java8 Stream 分頁(yè)
/**@Description: Java8 Stream 分頁(yè) * <br> 1. 起始位置邊界值處理: 同 subList 方法 * <br> 2. 終止位置:無(wú)需處理,會(huì)自動(dòng)處理邊界問(wèn)題 * @param pageSize 每頁(yè)顯示的數(shù)量 * @param pageNum 當(dāng)前頁(yè)碼 */ private List<?> subListJava8(ArrayList<?> list, int pageSize, int pageNum) { int count = list.size(); // 總記錄數(shù) // 計(jì)算總頁(yè)數(shù) int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1; // 起始位置 int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize); // 終止位置 int end = pageSize ; return list.stream().skip(start).limit(pageSize).collect(Collectors.toList()); }
4、使用 Lists 工具類的 partition 分頁(yè)
/**@Description: 使用 Lists 工具類的 partition 分頁(yè) * <br> 1. 頁(yè)碼邊界值處理:小于等于0,情況處理; 頁(yè)碼大于 (總頁(yè)數(shù)-1) 情況處理 * <br> 2. 總頁(yè)數(shù)-1 ,原因是:list集合索引是從0開(kāi)始的。 * @param pageSize 每頁(yè)顯示的數(shù)量 * @param pageNum 當(dāng)前頁(yè)碼 * @see com.google.common.collect.Lists#partition(java.util.List, int) */ private List<?> partition(ArrayList<?> list, int pageSize, int pageNum) { // 將 List 按照 PageSzie 拆分成多個(gè)List List<? extends List<?>> partition = Lists.partition(list, pageSize); // 總頁(yè)數(shù) int pages = partition.size(); pageNum = pageNum <= 0 ? 0 : (pageNum <= (pages - 1) ? pageNum : (pages - 1)); return partition.get(pageNum); }
三、總結(jié)
以上不管哪種方式實(shí)現(xiàn)分頁(yè),對(duì)性能都會(huì)有一定的影響,尤其是數(shù)據(jù)量越大,性能越差,因?yàn)槠湓硎侨頀呙?,將所有?shù)據(jù)查詢出來(lái)后,再在內(nèi)存中進(jìn)行分頁(yè)返回,在可能的情況下,盡量想想如何在sql查詢時(shí)實(shí)現(xiàn)分頁(yè)返回才好。
到此這篇關(guān)于Java 集合實(shí)現(xiàn)分頁(yè)-業(yè)務(wù)代碼實(shí)現(xiàn)分頁(yè)的文章就介紹到這了,更多相關(guān)Java 集合實(shí)現(xiàn)分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
intellij idea使用git stash暫存一次提交的操作
這篇文章主要介紹了intellij idea使用git stash暫存一次提交的操作,具有很好的參考價(jià)值希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Java利用poi讀取Excel詳解實(shí)現(xiàn)
Apache POI 是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的 Java API,Apache POI提供API給Java對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫(xiě),意為簡(jiǎn)潔版的模糊實(shí)現(xiàn)2022-07-07springboot配置多個(gè)數(shù)據(jù)源兩種方式實(shí)現(xiàn)
在我們的實(shí)際業(yè)務(wù)中可能會(huì)遇到;在一個(gè)項(xiàng)目里面讀取多個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)來(lái)進(jìn)行展示,spring對(duì)同時(shí)配置多個(gè)數(shù)據(jù)源是支持的,本文主要介紹了springboot配置多個(gè)數(shù)據(jù)源兩種方式實(shí)現(xiàn),感興趣的可以了解一下2022-03-03Java泛型機(jī)制與反射原理相關(guān)知識(shí)總結(jié)
今天帶大家學(xué)習(xí)的是關(guān)于Java進(jìn)階的相關(guān)知識(shí),文章圍繞著Java泛型機(jī)制與反射原理展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06在Java中實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法詳解
這篇文章主要介紹了在Java中實(shí)現(xiàn)可見(jiàn)性(visibility)的主要方法詳解,在Java中,使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或 java.util.concurrent包中的鎖)來(lái)確保對(duì)共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下2023-08-08Mybatis mapper接口動(dòng)態(tài)代理開(kāi)發(fā)步驟解析
這篇文章主要介紹了Mybatis mapper接口動(dòng)態(tài)代理開(kāi)發(fā)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07