1.问题来源

有的时候我们需要将一个大的List集合分割成多个小的List集合以便进行操作。比如批量查询、新增、或者删除的时候,如果数量太大,可能会导致诸如sql语句过长、执行缓慢等问题。这个时候我们需要将一个大的List集合分割成多个小的List集合以便分开操作,可以有效提升执行效率。

2.集合分组

这里是将一个大的List集合分割成多个小的List集合的实现方法,代码如下:

	/**
	 * 分割List集合 将一个大的List集合分割成多个小的List集合
	 * 
	 * @param <T> 指定List的数据类型
	 * @param oldList 原始集合
	 * @param batchSize 设置每个小集合的长度
	 * @return 分割后的指定数据类型的数据集合,每个元素都是分割后的List集合
	 */
	public static <T> List<List<T>> splitList(List<T> oldList, int batchSize) {
		if (batchSize < 1) {
			return null;
		}
		List<List<T>> result = new ArrayList<>();
		int size = oldList.size();
		int count = (size + batchSize - 1) / batchSize;
		for (int i = 0; i < count; i++) {
			int fromIndex = i * batchSize;
			int toIndex = (i + 1) * batchSize > size ? size : (i + 1) * batchSize;
			List<T> subList = oldList.subList(fromIndex, toIndex);
			result.add(subList);
		}
		return result;
	}

3.测试

编写一个测试方法,来验证是否可行,方法如下:

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		for (int i = 0; i < 16; i++) {
			list.add("数据" + (i + 1));
		}

		System.out.println("原始集合中的数据,共" + list.size() + "条信息:");
		System.out.println(list);
		System.out.println();

		// 分割List集合 将一个大的List集合分割成多个小的List集合
		List<List<String>> newList = splitList(list, 3);
		
		System.out.println("分割后的各个集合中的数据:");
		for (int i = 0, newListSiez = newList.size(); i < newListSiez; i++) {
			System.out.println("第" + (i + 1) + "个小集合中的数据,共" + newList.get(i).size() + "条:" + newList.get(i));
		}
	}

执行结果如下:

List集合分组(大List分割成多个小List)_工具类

4.完整工具类

import java.util.ArrayList;
import java.util.List;

/**
 * <h5>描述:List集合操作相关工具类</h5>
 * 
 */
public class ToolList {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		for (int i = 0; i < 16; i++) {
			list.add("数据" + (i + 1));
		}

		System.out.println("原始集合中的数据,共" + list.size() + "条信息:");
		System.out.println(list);
		System.out.println();

		// 分割List集合 将一个大的List集合分割成多个小的List集合
		List<List<String>> newList = splitList(list, 3);
		
		System.out.println("分割后的各个集合中的数据:");
		for (int i = 0, newListSiez = newList.size(); i < newListSiez; i++) {
			System.out.println("第" + (i + 1) + "个小集合中的数据,共" + newList.get(i).size() + "条:" + newList.get(i));
		}
	}

	/**
	 * 分割List集合 将一个大的List集合分割成多个小的List集合
	 * 
	 * @param <T> 指定List的数据类型
	 * @param oldList 原始集合
	 * @param batchSize 设置每个小集合的长度
	 * @return 分割后的指定数据类型的数据集合,每个元素都是分割后的List集合
	 */
	public static <T> List<List<T>> splitList(List<T> oldList, int batchSize) {
		if (batchSize < 1) {
			return null;
		}
		List<List<T>> result = new ArrayList<>();
		int size = oldList.size();
		int count = (size + batchSize - 1) / batchSize;
		for (int i = 0; i < count; i++) {
			int fromIndex = i * batchSize;
			int toIndex = (i + 1) * batchSize > size ? size : (i + 1) * batchSize;
			List<T> subList = oldList.subList(fromIndex, toIndex);
			result.add(subList);
		}
		return result;
	}
}