[Guava]-使用Iterators进行分组时遇见的坑
2018-04-03 15:33
197 查看
平常我们需要对一个大的list进行分批操作,一般使用Iterators#partition和paddedPartition方法(也可以使用Lists#partition)具体使用方式:
使用paddedPartition会出现一个问题,当最后一批的数据小于DEFAULT_MAX_SIZE时候,会把剩下的数据填充为null,比如
list = [1,2,3,4,5] -------paddedPartition(list,3)-------->[[1,2],[3,4],[5,null]]
我们看下源码
我们再看下他的孪生的方法
都是使用的同一个方法 一个pad(填充)设置为true,一个设置的false
另外,上面我们提到过Lists#partition的方法,他的做法是构建两个新的类实现的
List<Order> result = Lists.newArrayListWithCapacity(orders.size()); for (List<String> orderList : Iterables.paddedPartition(orders, DEFAULT_MAX_SIZE)) { //doSometime..... }
使用paddedPartition会出现一个问题,当最后一批的数据小于DEFAULT_MAX_SIZE时候,会把剩下的数据填充为null,比如
list = [1,2,3,4,5] -------paddedPartition(list,3)-------->[[1,2],[3,4],[5,null]]
我们看下源码
public static <T> UnmodifiableIterator<List<T>> paddedPartition(Iterator<T> iterator, int size) { return partitionImpl(iterator, size, true); } private static <T> UnmodifiableIterator<List<T>> partitionImpl( final Iterator<T> iterator, final int size, final boolean pad) { checkNotNull(iterator); checkArgument(size > 0); return new UnmodifiableIterator<List<T>>() { @Override public boolean hasNext() { return iterator.hasNext(); } @Override public List<T> next() { if (!hasNext()) { throw new NoSuchElementException(); } Object[] array = new Object[size]; int count = 0; for (; count < size && iterator.hasNext(); count++) { array[count] = iterator.next(); } for (int i = count; i < size; i++) { array[i] = null; // 这里重点,在这一步会判断下最后一页的剩余数据设置为null } @SuppressWarnings("unchecked") // we only put Ts in it List<T> list = Collections.unmodifiableList((List<T>) Arrays.asList(array)); // 这里会根据pad 判断是否返回list 还是 重新生成一个list return (pad || count == size) ? list : list.subList(0, count); } }; }
我们再看下他的孪生的方法
public static <T> UnmodifiableIterator<List<T>> partition(Iterator<T> iterator, int size) { return partitionImpl(iterator, size, false); }
都是使用的同一个方法 一个pad(填充)设置为true,一个设置的false
另外,上面我们提到过Lists#partition的方法,他的做法是构建两个新的类实现的
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); }
相关文章推荐
- Java8 集合元素使用Stream Api进行分组
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- C#中使用Join与GroupJoin将两个集合进行关联与分组
- python中Groupby使用(四)-通过函数进行分组
- Access使用查询--1.2.用选择查询进行分组数据的计算
- Hive:有表A与表B进行inner join,如果A分组内包含有数据,使用A,否则使用B分组下的数据
- 使用R进行分组统计
- ORACLE使用row_number() over(...)对查询数据进行分组并排序
- 使用JestClient连接elasticsearch-5.x对数据进行分组聚合
- 使用聚合函数group by后面必须要带着所有要查询的列,但是我只想根据group by后面的第一个列进行分组,怎么办? [
- Guava库学习:学习使用Preconditions工具类进行代码的校验
- datatable使用groupby进行分组统计
- DataTable、List使用groupby进行分组和分组统计;List、DataTable查询筛选方法
- elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
- pandas中Groupby使用(二)-对分组进行迭代
- php7中使用mongoDB的聚合操作对数据进行分组求和统计操作
- SpringMVC 使用JSR-303进行校验Bean Validation------分组校验
- [C/C++11]_[初级]_[使用正则表达式库进行分组查询]
- 使用TableView进行分组
- 关于使用group by对MySQL5.7的JSON类型进行分组