Lists.partition源码解析
使用示例
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
public static void main(String[] args) {
// 例:将集合:list 分割成每个集合25条数据的集合。
List<String> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
list.add(String.valueOf(i));
}
List<List<String>> partition = Lists.partition(list , 25);
for (List<String> data : partition) {
//执行插入
System.out.println(data.size());
}
}
源码分析
1.会创建一个RandomAccessPartition对象,RandomAccessPartition继承自 partition, partition又继承自AbstractList<List>
public static <T> List<List<T>> partition(List<T> list, int size) {
Preconditions.checkNotNull(list);
Preconditions.checkArgument(size > 0);
return (List)(list instanceof RandomAccess ? new RandomAccessPartition(list, size) : new Partition(list, size));
}
2、获取大小的时候会调用partition中重写的size方法
public int size() {
return IntMath.divide(this.list.size(), this.size, RoundingMode.CEILING);
}
3、示例代码中foreach循环获取元素会调用重写的get方法,这里面实现了集合的拆分
public List<T> get(int index) {
Preconditions.checkElementIndex(index, this.size());
int start = index * this.size;
int end = Math.min(start + this.size, this.list.size());
return this.list.subList(start, end);
}
4、,get方法会调用AbstractList的 subList方法
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<>(this, fromIndex, toIndex) :
new SubList<>(this, fromIndex, toIndex));
}
吐槽
大致是这样的,有点反人类,无语了。不过还有些地方不太明白,那就是为啥调试的时候直接显示就是拆分好了,感觉似乎就像是 Lists.partition(中就已经帮我们拆分好了一样,不理解。有了解的朋友评论一下。
关联信息
- 关联的主题:
- 上一篇:
- 下一篇:
- image: 20221021/1
- 转载自: