Java 中 List 分片的 5 种方法

1. Guava 框架分片

  1. <!-- google guava 工具类 -->
  2. <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
  3. <dependency>
  4. <groupId>com.google.guava</groupId>
  5. <artifactId>guava</artifactId>
  6. <version>31.0.1-jre</version>
  7. </dependency>
  1. import com.google.common.collect.Lists;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. /**
  5. * Guava 分片
  6. */
  7. public class PartitionByGuavaExample {
  8. // 原集合
  9. private static final List<String> OLD_LIST = Arrays.asList(
  10. "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
  11. public static void main(String[] args) {
  12. // 集合分片
  13. List<List<String>> newList = Lists.partition(OLD_LIST, 3);
  14. // 打印分片集合
  15. newList.forEach(i -> {
  16. System.out.println("集合长度:" + i.size());
  17. });
  18. }
  19. }

2. Apache 的 commons分片

  1. <!-- apache 集合工具类 -->
  2. <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
  3. <dependency>
  4. <groupId>org.apache.commons</groupId>
  5. <artifactId>commons-collections4</artifactId>
  6. <version>4.4</version>
  7. </dependency>
  1. import org.apache.commons.collections4.ListUtils;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. /**
  5. * commons.collections4 集合分片
  6. */
  7. public class PartitionExample {
  8. // 原集合
  9. private static final List<String> OLD_LIST = Arrays.asList(
  10. "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
  11. public static void main(String[] args) {
  12. // 集合分片
  13. List<List<String>> newList = ListUtils.partition(OLD_LIST, 3);
  14. newList.forEach(i -> {
  15. System.out.println("集合长度:" + i.size());
  16. });
  17. }
  18. }

3. 国产神级框架 Hutool 分片

  1. <!-- 工具类 hutool -->
  2. <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
  3. <dependency>
  4. <groupId>cn.hutool</groupId>
  5. <artifactId>hutool-all</artifactId>
  6. <version>5.7.14</version>
  7. </dependency>
  1. import cn.hutool.core.collection.ListUtil;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. public class PartitionByHutoolExample {
  5. // 原集合
  6. private static final List<String> OLD_LIST = Arrays.asList(
  7. "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
  8. public static void main(String[] args) {
  9. // 分片处理
  10. List<List<String>> newList = ListUtil.partition(OLD_LIST, 3);
  11. newList.forEach(i -> {
  12. System.out.println("集合长度:" + i.size());
  13. });
  14. }
  15. }

4. JDK 8 中提供 Stream 分片

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.Map;
  4. import java.util.stream.Collectors;
  5. /**
  6. * JDK Stream Partition
  7. */
  8. public class PartitionByStreamExample {
  9. // 原集合
  10. private static final List<Integer> OLD_LIST = Arrays.asList(
  11. 1, 2, 3, 4, 5, 6);
  12. public static void main(String[] args) {
  13. // 集合分片:将大于 3 和小于等于 3 的数据分别分为两组
  14. Map<Boolean, List<Integer>> newMap = OLD_LIST.stream().collect(
  15. Collectors.partitioningBy(i -> i > 3)
  16. );
  17. // 打印结果
  18. System.out.println(newMap);
  19. }
  20. }

此方式的优点的无需添加任何框架,但缺点是只能实现简单的分片(将一个 List 分为两个),并且要有明确的分片条件。比如本篇案例中设置的分片条件就是数组是否大于 3,如果大于 3 就会被归为一组,否则就会被分到另一组。

5. 自定义分片功能

自定义分片功能的关键实现方法是 JDK 自带的 subList 方法

  1. import java.util.Arrays;
  2. import java.util.List;
  3. public class App {
  4. private static final List<String> _OLD_LIST = Arrays.asList(
  5. "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
  6. public static void main(String[] args) {
  7. // 集合分隔
  8. List<String> list = _OLD_LIST.subList(0, 3);
  9. // 打印集合中的元素
  10. list.forEach(i -> {
  11. System.out.println(i);
  12. });
  13. }
  14. }