大批量数量分割处理,stream处理

602 阅读1分钟

开发中经常遇到大量数据需要分批处理的场景

1.一般我们是用 do while + sbuList来分割成多批

2.使用stream封闭成工具类,处理简单高效

/**
 * 计算切分次数
 * @param size 需要分割的集合长度
 * @param maxNum 集合最大的数量
 * @return 切分次数
 */
private static Integer countStep(Integer size, Integer maxNum) {
    return (size + maxNum - 1) / maxNum;
}

/**
 * 将一个集合进行分割
 * @param collections 需要分割的集合 (List LinkedHashSet TreeSet LinkedList)
 * @param maxNum 集合最大的数量
 * @param <T>
 * @return 分割后的集合
 */
public static <T> Collection<Collection<T>> subCollection(Collection<T> collections, int maxNum){

    int limit = countStep(collections.size(), maxNum);

    Collection<Collection<T>> splitCollection = Stream.iterate(
            0, n -> n + 1).limit(limit).parallel().map(
            a -> collections.stream().skip(a * maxNum).limit(maxNum).parallel()
                    .collect(Collectors.toList())).collect(Collectors.toList());

    return splitCollection;
}

public static void main(String[] args) {
    List<String> cams = new ArrayList<>();
    cams.add("12321312345645645645");
    cams.add("2326766762244565234");
    cams.add("3326764546762245644234");
    cams.add("243264565667624524234");
    cams.add("9245637672445656624234");
    cams.add("8274565476565673224234");
    cams.add("7264567322456454234");
    cams.add("6274564564566733224234");
    cams.add("5337656546423224234");

    System.out.println(SplitCollectionUtils.subCollection(cams, 4));
}