注:工具升级为SplitUtil,建议使用这个:Java分页、集合拆分、分批多线程执行工具类SplitUtil
理由:
1、很多第三方工具库均有ListUtil工具类,重名且功能更丰富
2、原先写这个工具类的初衷大部分是为了partition这个方法,也就是对一个list进行拆分并进行后续处理,现对这个操作进行了封装增强
原始代码:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 使用stream流实现的List工具类
*/
public class ListUtil {
/**
* 集合拆分
*
* @param collection 原始集合
* @param size 子集合长度
* @param <T>
* @return
*/
public static <T> List<List<T>> partition(Collection<T> collection, int size) {
if (size <= 0) {
throw new IllegalArgumentException("size must be greater than 0");
}
List<T> list = toArrayList(collection);
//计算可以拆分成几个list
int count = (int) Math.ceil(list.size() / (double) size);
//使用流进行拆分
return Stream.iterate(0, n -> n + 1).limit(count).map(
i -> list.stream().skip((long) i * size).limit(size).collect(Collectors.toList())
).collect(Collectors.toList());
}
/**
* 对List分页取值(页码从1开始)
*
* @param list
* @param pageNum
* @param pageSize
* @param <T>
* @return
*/
public static <T> List<T> page(List<T> list, int pageNum, int pageSize) {
if (pageNum <= 0 || pageSize <= 0) {
throw new IllegalArgumentException("pageNum or pageSize must be greater than 0");
}
//使用流进行分页取值
return list.stream()
.skip((long) (pageNum - 1) * pageSize)
.limit(pageSize)
.collect(Collectors.toList());
}
/**
* 对List进行截取
*
* @param list
* @param start
* @param end
* @param <T>
* @return
*/
public static <T> List<T> sub(List<T> list, int start, int end) {
start = Math.max(start, 0);
end = Math.max(end, 0);
//使用流进行截取
return list.stream()
.skip(start)
.limit(end - start)
.collect(Collectors.toList());
}
/**
* 集合转成ArrayList
*
* @param collection
* @param <T>
* @return
*/
public static <T> List<T> toArrayList(Collection<T> collection) {
return collection == null ? new ArrayList<>() : new ArrayList<>(collection);
}
}