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");
}
}