概述
本文講述下如何將一個(gè)List拆分成多個(gè)subList,這個(gè)常用的操作主要會(huì)用于一個(gè)列表的內(nèi)存分頁處理均牢,雖然在Java的基本API里有subList,但并沒有提供便捷方法實(shí)現(xiàn)分頁才睹,需要自己去計(jì)算頁碼邊界徘跪。
但有兩個(gè)類庫提供了簡單易用的API方法實(shí)現(xiàn), Guava和 Apache Commons Collections
使用 Guava 分頁
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.6-jre</version>
</dependency>
@Test
public void useGuavaPartitionList() {
List<Integer> originList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> pagedList = Lists.partition(originList, 3);
//最后一頁是兩個(gè)數(shù)字 7琅攘、8
List<Integer> lastPage = pagedList.get(2);
List<Integer> expectedLastPage = Lists.<Integer> newArrayList(7, 8);
assertThat(pagedList.size(), equalTo(3));
assertThat(lastPage, equalTo(expectedLastPage));
}
上面的這個(gè)例子使用的時(shí)候需要注意一點(diǎn)垮庐,分區(qū)的原集合發(fā)生改變,會(huì)同步改變到子集合列表上坞琴∩诓椋看下代碼
@Test
public void originListChanged() {
// 初始化一個(gè)集合
List<Integer> originList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> pagedList = Lists.partition(originList, 3);
// 當(dāng)原始的集合發(fā)生改變,增加了一個(gè)元素
originList.add(9);
// 子列表同時(shí)發(fā)生改變
List<Integer> lastPage = pagedList.get(2);
List<Integer> expectedLastPage = Lists.<Integer> newArrayList(7, 8, 9);
assertThat(lastPage, equalTo(expectedLastPage));
}
使用 Apache Commons Collections
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
@Test
public void useCommonsCollections4() {
List<Integer> originList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> pagedList = ListUtils.partition(originList, 3);
List<Integer> lastPage = pagedList.get(2);
List<Integer> expectedLastPage = Lists.<Integer> newArrayList(7, 8);
assertThat(pagedList.size(), equalTo(3));
assertThat(lastPage, equalTo(expectedLastPage));
}
結(jié)語
以上演示了兩個(gè)類庫提供的列表分區(qū)的實(shí)現(xiàn)剧辐,就此寒亥,今日任務(wù)完成。