[Guava]-使用Iterators进行分组时遇见的坑
生活随笔
收集整理的這篇文章主要介紹了
[Guava]-使用Iterators进行分组时遇见的坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
平常我們需要對一個大的list進行分批操作,一般使用Iterators#partition和paddedPartition方法(也可以使用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>>() {@Overridepublic boolean hasNext() {return iterator.hasNext();}@Overridepublic 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 itList<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);}轉載于:https://my.oschina.net/lowkeysoft/blog/1789307
總結
以上是生活随笔為你收集整理的[Guava]-使用Iterators进行分组时遇见的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lambda化的一个例子
- 下一篇: CSU 1779: 错误的算法【矩阵/模