Java中按指定大小分割List集合

2024-09-04 12:24:15 浏览数 (1)

技术博客:Java中按指定大小分割List集合

在日常的Java编程中,处理大量数据集合时,我们经常会遇到需要将一个大集合分割成多个小集合的情况,以便于分批处理或并行处理。比如,当我们从数据库中一次性查询出大量数据,为了避免内存溢出或提高处理效率,我们可能需要将这批数据分割成多个小块,每块包含固定数量的元素。今天,我们就来探讨如何在Java中按指定大小分割List集合。

需求分析

假设我们有一个包含上万条数据的List集合,我们想要将其分割成多个子集合,每个子集合包含最多5000条数据。这样,我们就可以对每个子集合进行单独处理,而不需要一次性处理整个大集合。

实现方法

为了完成这个任务,我们可以编写一个通用的方法,该方法接受一个List集合和一个指定的大小作为参数,然后返回一个包含多个子集合的List。每个子集合都是原集合的一个片段,且每个片段的大小不超过指定的大小。

示例代码

下面是一个简单的Java方法实现,用于按指定大小分割List集合:

代码语言:java复制
import java.util.ArrayList;
import java.util.List;

public class ListUtil {

    /**
     * 按指定大小,分隔集合为N个部分
     *
     * @param list   原集合,为空时则返回空集合
     * @param length 指定的大小
     * @return 分割后的集合列表
     */
    public static <T> List<List<T>> splitList(List<T> list, int length) {
        // 返回结果
        List<List<T>> result = new ArrayList<>();

        // 为空则返回空
        if (list == null || list.isEmpty()) {
            return result;
        }

        // 传入集合长度
        int size = list.size();

        // 如果传入集合长度小于指定长度,直接返回原集合
        if (size <= length) {
            result.add(list);
            return result;
        }

        // 分隔后的集合个数
        int count = (size   length - 1) / length;
        for (int i = 0; i < count; i  ) {
            // 计算当前子集合的结束索引
            int toIndex = Math.min((i   1) * length, size);
            List<T> subList = list.subList(i * length, toIndex);
            result.add(subList);
        }
        return result;
    }
}

使用示例

假设我们有一个包含大量String的List集合styleIds,我们想要每次处理1000条数据:

代码语言:java复制
List<String> styleIds = // 假设这里是从某处获取的大量数据
List<List<String>> styleIdSplit = ListUtil.splitList(styleIds, 1000);

// 现在styleIdSplit包含了多个子集合,每个子集合最多包含1000条数据
for (List<String> subList : styleIdSplit) {
    // 对每个子集合进行处理
    // ...
}

注意事项

  • 当使用subList方法时,返回的子列表是原列表的一个视图,对子列表的非结构性修改都会反映到原列表上。但结构性修改(如添加、删除等)会抛出ConcurrentModificationException。因此,在大多数情况下,你可能需要将子列表复制一份再进行操作。
  • 在计算子列表的结束索引时,我们使用Math.min来确保不会超出原列表的边界。

通过这种方法,我们可以灵活地处理大量数据,避免了一次性处理所有数据带来的性能问题。希望这篇文章对你有所帮助!

0 人点赞