Java 中 List 分片的 5 种方法
1. Guava 框架分片
<!-- google guava 工具类 --><!-- https://mvnrepository.com/artifact/com.google.guava/guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>
import com.google.common.collect.Lists;import java.util.Arrays;import java.util.List;/*** Guava 分片*/public class PartitionByGuavaExample {// 原集合private static final List<String> OLD_LIST = Arrays.asList("唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));public static void main(String[] args) {// 集合分片List<List<String>> newList = Lists.partition(OLD_LIST, 3);// 打印分片集合newList.forEach(i -> {System.out.println("集合长度:" + i.size());});}}
2. Apache 的 commons分片
<!-- apache 集合工具类 --><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>
import org.apache.commons.collections4.ListUtils;import java.util.Arrays;import java.util.List;/*** commons.collections4 集合分片*/public class PartitionExample {// 原集合private static final List<String> OLD_LIST = Arrays.asList("唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));public static void main(String[] args) {// 集合分片List<List<String>> newList = ListUtils.partition(OLD_LIST, 3);newList.forEach(i -> {System.out.println("集合长度:" + i.size());});}}
3. 国产神级框架 Hutool 分片
<!-- 工具类 hutool --><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency>
import cn.hutool.core.collection.ListUtil;import java.util.Arrays;import java.util.List;public class PartitionByHutoolExample {// 原集合private static final List<String> OLD_LIST = Arrays.asList("唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));public static void main(String[] args) {// 分片处理List<List<String>> newList = ListUtil.partition(OLD_LIST, 3);newList.forEach(i -> {System.out.println("集合长度:" + i.size());});}}
4. JDK 8 中提供 Stream 分片
import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.stream.Collectors;/*** JDK Stream Partition*/public class PartitionByStreamExample {// 原集合private static final List<Integer> OLD_LIST = Arrays.asList(1, 2, 3, 4, 5, 6);public static void main(String[] args) {// 集合分片:将大于 3 和小于等于 3 的数据分别分为两组Map<Boolean, List<Integer>> newMap = OLD_LIST.stream().collect(Collectors.partitioningBy(i -> i > 3));// 打印结果System.out.println(newMap);}}
此方式的优点的无需添加任何框架,但缺点是只能实现简单的分片(将一个 List 分为两个),并且要有明确的分片条件。比如本篇案例中设置的分片条件就是数组是否大于 3,如果大于 3 就会被归为一组,否则就会被分到另一组。
5. 自定义分片功能
自定义分片功能的关键实现方法是 JDK 自带的 subList 方法
import java.util.Arrays;import java.util.List;public class App {private static final List<String> _OLD_LIST = Arrays.asList("唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));public static void main(String[] args) {// 集合分隔List<String> list = _OLD_LIST.subList(0, 3);// 打印集合中的元素list.forEach(i -> {System.out.println(i);});}}
