集合LIST指定大小数据分区
2021-04-25 本文已影响0人
明训
背景说明
处理集合List大量数据的时候经常需要切分处理,这里针对常用的切分方案记录如下
解决方案
guava工具包
引入maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
编写代码
public static void main(String[] args) {
List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
List<List<String>> partitionList = Lists.partition(dataList, 5);
System.out.println(partitionList.size());
}
commons-collections4工具包
引入maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.3</version>
</dependency>
编写代码
public static void main(String[] args) {
List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
List<List<String>> partitionList = ListUtils.partition(dataList, 5);
System.out.println(partitionList.size());
}
Java8 Stream
方案一
public static <T> List<List<T>> partition(final List<T> list, final int size){
int limit = (list.size() + size - 1) / size;
List<List<T>> partitionList = new ArrayList<>();
Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
partitionList.add(list.stream().skip(i * size).limit(size).collect(Collectors.toList()));
});
return partitionList;
}
public static void main(String[] args) {
List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
List<List<String>> partitionList = partition(dataList, 5);
System.out.println(JSON.toJSONString(partitionList));
}
方案二
public static void main(String[] args) {
List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
List<List<String>> partitionList = partition(dataList, 5);
System.out.println(JSON.toJSONString(partitionList));
public static <T> List<List<T>> partition(final List<T> list, final int size) {
int limit = (list.size() + size - 1) / size;
List<List<T>> partitionList = Stream.iterate(0, n -> n + 1).limit(limit).parallel()
.map(a -> list.stream().skip(a * size).limit(size).parallel().collect(Collectors.toList()))
.collect(Collectors.toList());
return partitionList;
}
Java7裸写
public static void main(String[] args) {
List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
List<List<String>> partitionList = partition(dataList, 5);
System.out.println(JSON.toJSONString(partitionList));
}
/**
* 等分为指定个数的数组,将一组数据平均分成n组
* @param list 要分组的数据源
* @param size 平均分成size组
* @return
*/
public static <T> List<List<T>> averagePartition(List<T> list,final int size) {
List<List<T>> partitionList = new ArrayList<List<T>>();
int remaider = list.size() % size;
int number = list.size() / size;
int offset = 0;
for (int i = 0; i < size; i++) {
List<T> value = null;
if (remaider > 0) {
value = list.subList(i * number + offset, (i + 1) * number + offset + 1);
remaider--;
offset++;
} else {
value = list.subList(i * number + offset, (i + 1) * number + offset);
}
partitionList.add(value);
}
return partitionList;
}
/**
* 等分为指定长度的数组,将一组数据固定分组,每组n个元素
* @param list 要分组的数据源
* @param size 每组size个元素
* @return
*/
public static <T> List<List<T>> partition(List<T> source,final int size) {
List<List<T>> partitionList = new ArrayList<List<T>>();
int remainder = source.size() % size;
int number = (source.size() / size);
for (int i = 0; i < number; i++) {
List<T> subset = null;
subset = source.subList(i * size, (i + 1) * size);
partitionList.add(subset);
}
if (remainder > 0) {
List<T> subset = null;
subset = source.subList(number * size, number * size + remainder);
partitionList.add(subset);
}
return partitionList;
}