文章目录
- Java 中 List 分片的 7种方法
- 业务需求背景
- 实现方法
- 方法一:最基本的 for 循环实现
- 方法二:利用 List 的 subList() 方法
- 方法三:stream 流操作 filter 方法过滤
- 方法四:使用 Google Guava 的 Lists.partition 方法
- 方法五:使用 apache commons 的 ListUtils.partition 方法
- 方法六:使用 Hutool 的 ListUtil.partition 方法
- 方法七:使用 Java8 的 Collectors.partitioningBy() 方法
Java 中 List 分片的 7种方法
业务需求背景
最近的一个需求中需要将一个完整的 List 分割成两部分,比如:
- 集合 [1,2,3,4,5] 需要分割成 [1,2,3] 和 [4,5];
- 集合 [1,2,3,4,5,6] 需要分割成 [1,2,3] 和 [4,5,6];
实现方法
方法一:最基本的 for 循环实现
实现代码:
public static void divideList(List<String> list) {List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();int length = list.size();// 判断集合元素个数是奇数个if (length % 2 == 1) {for (int i = 0; i < length; i++) {if (i < (length / 2 + 1)) {firstList.add(list.get(i));} else {secondList.add(list.get(i));}}} else {for (int i = 0; i < length; i++) {if (i < (length / 2)) {firstList.add(list.get(i));} else {secondList.add(list.get(i));}}}System.out.println("firstList"+firstList);System.out.println("secondList"+secondList);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList(list1);}
测试结果:
方法二:利用 List 的 subList() 方法
public static void divideList2(List<String> list) {int length = list.size();int mid = length / 2; // 计算中间位置List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();// 判断集合元素个数是奇数个if (length % 2 == 1) {firstList = new ArrayList<>(list.subList(0, mid + 1)); // 获取前半部分 listsecondList = new ArrayList<>(list.subList(mid + 1, list.size())); // 获取后半部分 list} else {firstList = new ArrayList<>(list.subList(0, mid)); // 获取前半部分 listsecondList = new ArrayList<>(list.subList(mid, list.size())); // 获取后半部分 list}System.out.println("firstList" + firstList);System.out.println("secondList" + secondList);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList2(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList2(list1);}
测试结果:
方法三:stream 流操作 filter 方法过滤
public static void divideList3(List<String> list) {int length = list.size();int mid = length / 2;List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();// 判断集合元素个数是奇数个if (length % 2 == 1) {firstList = list.stream().filter(str -> Integer.valueOf(str) <= mid + 1).collect(Collectors.toList()); // 获取前半部分 listsecondList = list.stream().filter(str -> Integer.valueOf(str) > mid + 1).collect(Collectors.toList()); // 获取后半部分 list} else {firstList = list.stream().filter(str -> Integer.valueOf(str) <= mid).collect(Collectors.toList()); // 获取前半部分 listsecondList = list.stream().filter(str -> Integer.valueOf(str) > mid).collect(Collectors.toList()); // 获取后半部分 list}System.out.println("firstList" + firstList);System.out.println("secondList" + secondList);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList3(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList3(list1);}
测试结果:
方法四:使用 Google Guava 的 Lists.partition 方法
Lists.partition 方法可以更加灵活的按照几个元素为一组的形式进行分割。
首先,进入 Lists.partition 方法源码:
可以看到,方法需要传入两个参数,其中:list 参数是要分割的集合,size 表示几个元素分割为一组。比如 size 是3,表示拆分成拆分的集合大小为3(即3个元素分为一组),后面不足3的有多少算多少
。分割完集合,将分割完的集合封装在一个集合里返回。
在 pom.xml 中添加依赖:
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>
实现代码:
import com.google.common.collect.Lists;public static void divideList4(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = Lists.partition(list, mid + 1);} else {partition = Lists.partition(list, mid);}System.out.println(partition);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList4(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList4(list1);}
测试结果:
方法五:使用 apache commons 的 ListUtils.partition 方法
apache commons 的 ListUtils.partition 方法使用和 Google Guava 的 Lists.partition 方法大体一致
添加依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>
实现代码:
import org.apache.commons.collections4.ListUtils;public static void divideList5(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = ListUtils.partition(list, mid + 1);} else {partition = ListUtils.partition(list, mid);}System.out.println(partition);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList5(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList5(list1);}
测试结果:
方法六:使用 Hutool 的 ListUtil.partition 方法
添加依赖:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency>
实现代码:
import cn.hutool.core.collection.ListUtil;public static void divideList6(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = ListUtil.partition(list, mid + 1);} else {partition = ListUtil.partition(list, mid);}System.out.println(partition);}
方法七:使用 Java8 的 Collectors.partitioningBy() 方法
实现方法:
public static void divideList7(List<String> list) {Map<Boolean, List<String>> groups =list.stream().collect(Collectors.partitioningBy(s -> Integer.parseInt(s) > 3));List<List<String>> subSets = new ArrayList<List<String>>(groups.values());System.out.println(subSets);}
测试:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList7(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList7(list1);}
测试结果: