guava中Lists.partition方法分割List源码分析

主旨

    在对List进行批量操作时,为了控制每次处理List的数据量,通常会将一个大的List进行分割,这时可以用到 com.google.guava 包中的 Lists.partition(List list, int size) 方法。网上也有对这段代码分析的文章,看了几篇之后感觉没有说到重点,所以自己写一篇。

    这段源码的重点在于Lists.partition方法返回的是Partition类,这是一个继承自java.util.List的私有类,该方法返回的实例list调用get等方法时的处理,实际是Partition类中覆写的代码来完成的。

执行流程

在分割过程中主要用到的类,关系图如下

1
2
3
4
5
6
7
public static <T> List<List<T>> partition(List<T> list, int size) {
checkNotNull(list);
checkArgument(size > 0);
return (list instanceof RandomAccess)
? new RandomAccessPartition<T>(list, size)
: new Partition<T>(list, size);
}

分割方法会根据传入的list的是否属于RandomAccess,去创建Partition的子类RandomAccessPartition,或者是直接创建Partition类,这里的RandomAccess接口是为了尽可能提高操作效率的一种方式。
创建Partition类的构造方法如下:

1
2
3
4
5
6
7
8
9
private static class Partition<T> extends AbstractList<List<T>> {
final List<T> list;
final int size;

Partition(List<T> list, int size) {
this.list = list;
this.size = size;
}
……

在使用partition方法返回的List 实例时,调用熟悉的get方法时,实际调用的是Partition类覆写的方法,看一个最常见的get方法

1
2
3
4
5
6
7
@Override 
public List<T> get(int index) {
checkElementIndex(index, size());
int start = index * size;
int end = Math.min(start + size, list.size());
return list.subList(start, end);
}

可以看到在调用get方法时,代码将源list进行了分割操作

完结

     这种使用private static修改的内部类(static修饰的内部类可以像普通类一样使用,使用它不需要实例一个外部类),很好的保护了代码实现细节,通过重写父类方法实现功能,使代码用起来很方便。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 AChampion
  • Powered by Hexo Theme Ayer
  • PV: UV:

开玩笑的~不用打赏