錫盟建設(shè)工程造價(jià)管理站網(wǎng)站凡科建站怎么建網(wǎng)站
一、前言
? ? ? ? 在Java開(kāi)發(fā)中,若單次展示的數(shù)據(jù)量太大,會(huì)造成程序響應(yīng)緩慢,就需要用到 分頁(yè) 功能,每一頁(yè)展示一定量的數(shù)據(jù),分多次展示 ... 那么在List集合中,如何實(shí)現(xiàn) 分頁(yè) 功能呢?
? ? ? ? 本文將以3種方式,分別是: subList 方法、Java8 Stream 、Lists.partition,實(shí)現(xiàn) List集合的分頁(yè)功能。
二、代碼實(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è)碼* @version v1.0* @author wu* @date 2022/7/31 11:44*/
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è)碼* @version v1.0* @author wu* @date 2022/7/31 11:49*/
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è)碼* @version v1.0* @author wu* @date 2022/7/31 11:55* @see com.google.common.collect.Lists#partition(java.util.List, int)*/
private List<?> partition(ArrayList<?> list, int pageSize, int pageNum) {// 將 List 按照 PageSzie 拆分成多個(gè)ListList<? 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);
}
三、測(cè)試
????????1、使用List的 subList 方法實(shí)現(xiàn)分頁(yè) 測(cè)試:
/*** @Description: 使用List的 subList 方法實(shí)現(xiàn)分頁(yè)* @version v1.0* @author wu* @date 2022/7/31 10:43*/
@Test
public void subListTest() {int pageSize = 3; // 每一頁(yè)顯示的數(shù)量int pageNum = 2; // 頁(yè)碼System.out.println(subList(list, pageSize, -2));System.out.println(subList(list, pageSize, 0));System.out.println(subList(list, pageSize, 1));// 第一頁(yè)System.out.println(subList(list, pageSize, 2));System.out.println(subList(list, pageSize, 3));System.out.println(subList(list, pageSize, 4)); // 第四頁(yè)數(shù)據(jù)System.out.println(subList(list, pageSize, 5)); // 第五頁(yè)數(shù)據(jù)
}
???2、使用 Java8 Stream 實(shí)現(xiàn)分頁(yè) 測(cè)試:
/**@Description: 使用 Java8 Stream 實(shí)現(xiàn)分頁(yè)* @version v1.0* @author wu* @date 2022/7/31 11:44*/
@Test
public void subListJava8Test() {int pageSize = 3; // 每一頁(yè)顯示的數(shù)量int pageNum = 2; // 頁(yè)碼System.out.println(subListJava8(list, pageSize, -2));System.out.println(subListJava8(list, pageSize, 0));System.out.println(subListJava8(list, pageSize, 1));// 第一頁(yè)System.out.println(subListJava8(list, pageSize, 2));System.out.println(subListJava8(list, pageSize, 3));System.out.println(subListJava8(list, pageSize, 4)); // 第四頁(yè)數(shù)據(jù)System.out.println(subListJava8(list, pageSize, 5)); // 第四頁(yè)數(shù)據(jù)
}
3、Lists 工具類的 partition 分頁(yè) 測(cè)試:
@Test
public void partitionTest() {int pageSize = 3; // 每一頁(yè)顯示的數(shù)量int pageNum = 2; // 頁(yè)碼System.out.println(partition(list, pageSize, -2));System.out.println(partition(list, pageSize, 0));System.out.println(partition(list, pageSize, 1));// 第一頁(yè)System.out.println(partition(list, pageSize, 2));System.out.println(partition(list, pageSize, 3));System.out.println(partition(list, pageSize, 4)); // 第四頁(yè)數(shù)據(jù)System.out.println(partition(list, pageSize, 5)); // 第五頁(yè)數(shù)據(jù)System.out.println(partition(list, pageSize, 6)); // 第六頁(yè)數(shù)據(jù)
}
四、總結(jié)
? ? ? ? 1、以上是List集合實(shí)現(xiàn)分頁(yè)的3種方式,在實(shí)際工作應(yīng)用中,一般很少,都是在數(shù)據(jù)中實(shí)現(xiàn)好的分頁(yè),偶爾遇到實(shí)際要使用時(shí),翻開(kāi)文章,可以做到 “開(kāi)箱即用”!
? ? ? ? 2、注意點(diǎn):本文分頁(yè)案例中,都已經(jīng)對(duì) 極端情況(邊界值)處理,可以有效避免索引越界的情況,如下:
? ? ? 開(kāi)始位置: 當(dāng)前頁(yè)碼值 <= 0 , 取值 第一頁(yè) ; 當(dāng)前頁(yè)碼 > 總頁(yè)數(shù) , 取值 總頁(yè)數(shù)
? ? ? 結(jié)束位置:當(dāng)前頁(yè)碼值 <= 0 ,則判斷 每頁(yè)顯示數(shù)據(jù) 是否小于總記錄數(shù) ( pageSize <= count? ? ? ?? pageSize : count ); 當(dāng)前頁(yè)碼 > 0 , 則判斷 結(jié)束數(shù)量 是否小于等于 總記錄數(shù) ( pageSize? ? ? ?*??pageNum <= count ? pageSize * pageNum : count )
3、Lists 工具類,依賴 pom.xml :
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.0-jre</version>
</dependency>
4、補(bǔ)充一個(gè) List 集合創(chuàng)建 笛卡爾積的方法:
List<List<Integer>> lists = Lists.cartesianProduct(list1, list2);