在日常工作中我们都会遇到将数据进行分组的需求
- 那么在Java 中如何将简单又方便的将list集合进行分组呢?
- 在java8特性中我们可以使用stream流很方便的对集合进行操作
原始方法分组
public static <T> List<List<T>> split(List<T> collection, int size) {
final List<List<T>> result = new ArrayList<>();
if (CollUtil.isEmpty(collection)) {
return result;
}
ArrayList<T> subList = new ArrayList<>(size);
for (T t : collection) {
if (subList.size() >= size) {
result.add(subList);
subList = new ArrayList<>(size);
}
subList.add(t);
}
result.add(subList);
return result;
}
public static <T> List<List<T>> splistList(List<T> list, int group) {
List<List<T>> lists = new ArrayList<List<T>>();
if (CollectionUtils.isEmpty(list)) {
return lists;
}
int length = list.size();
int number = length % group == 0 ? (length / group) : (length / group + 1);
for (int index = 0; index < number; index++) {
List<T> targetList = list.subList(index * group,
(index + 1) * group > length ? length : (index + 1) * group);
lists.add(targetList);
}
return lists;
}
使用hutool 切割
1.导入pom文件
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.11</version>
</dependency>
2.测试
public static void main(String[] args){
List<String> list = Arrays.asList("a", "b", "c");
// 用指定字符分割集合
List<List<String>> join = CollUtil.split(list, 1);
System.out.println(JSON.toJSONString(join));
}
流切割
public static <T> List<List<T>> partition( List<T> list, int size) {
Integer limit = (list.size() + size - 1) / size;
List<List<T>> mglist = new ArrayList<List<T>>();
Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
mglist.add(list.stream().skip(i * size).limit(size).collect(Collectors.toList()));
});
return mglist;
}