Java如何将List按固定大小拆分生成嵌套子列表?
Java 列表按固定大小拆分实现方案
针对正则提取得到的单层字符串列表,按每3个元素为一组拆分为嵌套列表的需求,可通过以下几种方式实现:
无第三方依赖 原生实现(兼容所有Java版本)
直接手写通用分片方法,不需要引入任何外部依赖,适配所有JDK版本:
import java.util.ArrayList; import java.util.List; public class ListSplit { public static <T> List<List<T>> split(List<T> source, int chunkSize) { List<List<T>> result = new ArrayList<>(); if (source == null || source.isEmpty() || chunkSize < 1) { return result; } int total = source.size(); int chunkNum = (total + chunkSize - 1) / chunkSize; for (int i = 0; i < chunkNum; i++) { int start = i * chunkSize; int end = Math.min(start + chunkSize, total); // 用new ArrayList包裹subList结果,生成独立子列表,避免原列表修改影响分片 result.add(new ArrayList<>(source.subList(start, end))); } return result; } public static void main(String[] args) { // 替换为你的正则提取得到的data列表即可 List<String> data = List.of("text", "text2", "text3", "text4", "text5", "text6"); List<List<String>> nestedList = split(data, 3); // 输出结果:[[text, text2, text3], [text4, text5, text6]] System.out.println(nestedList); } }
注意:List.subList()返回的是原列表的视图,不是独立的新列表,必须做一层拷贝,否则后续修改原列表会导致分片内容异常。
Java 8+ 流式实现
如果你的项目使用JDK8及以上版本,可以用Stream流更简洁地实现:
int chunkSize = 3; List<List<String>> nestedList = IntStream.range(0, (data.size() + chunkSize - 1) / chunkSize) .mapToObj(i -> data.subList(i * chunkSize, Math.min(i * chunkSize + chunkSize, data.size()))) .map(ArrayList::new) .toList();
第三方工具类直接调用
如果项目中已经引入常用工具类依赖,可以直接调用封装好的分片方法,不需要自己写逻辑:
- Guava 工具类:
List<List<String>> nestedList = Lists.partition(data, 3); - Apache Commons Collections 工具类:
List<List<String>> nestedList = ListUtils.partition(data, 3);
注意:上述两个工具类的partition方法返回的同样是原列表视图,需要独立子列表时要手动做一层ArrayList拷贝。
内容的提问来源于stack exchange,提问作者Mix32
相关产品推荐
相关产品推荐

