将一个集合按指定大小分割成多个集合(Stream)


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @ClassName SkipListTest
 * @Description 将一个集合按指定大小分割成多个集合
 * @Author lyn
 * @Date 2021/12/30 14:26
 */
@SuppressWarnings("all")
public class SkipListTest {
    public static void main(String[] args) {
        //1 准备要分割的数据集合(模拟)
        //获取一个1-10000的集合
        //List list = IntStream.range(1, 10000).boxed().collect(Collectors.toList());
        List list = Stream.iterate(1, n -> n + 1).limit(10001).collect(Collectors.toList());

        //2 分割的基础数据
        //子集合的大小
        final int SON_SIZE = 100;
        //分割的份数
        final int COPIES = (list.size() + SON_SIZE - 1) / SON_SIZE;

        //3 分割方案
        //手动分割
        long startTime = System.currentTimeMillis();
        List> sonLists = new ArrayList<>();
        Stream.iterate(0, n -> n + 1)
                .limit(COPIES)
                .parallel()
                .forEach(i -> {
                    int fromIndex = i * SON_SIZE;
                    int toIndex = fromIndex + SON_SIZE;
                    sonLists.add(list.stream().skip(fromIndex).limit(toIndex).collect(Collectors.toList()));
                }
        );
        System.err.println("手动分割 总耗时:" + (System.currentTimeMillis() - startTime) + " ms");
        //映射分割(推荐,耗时短,有序)
        startTime = System.currentTimeMillis();
        List> sonListTwo = IntStream.range(0, COPIES)
                .boxed()
                .parallel()
                .map(i -> {
                    int fromIndex = i * SON_SIZE;
                    int toIndex = fromIndex + SON_SIZE;
                    return list.stream().skip(fromIndex).limit(toIndex).collect(Collectors.toList());
                }).collect(Collectors.toList());
        System.err.println("映射分割 总耗时:" + (System.currentTimeMillis() - startTime) + " ms");
    }
}