日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Guava]-使用Iterators进行分组时遇见的坑

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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进行分组时遇见的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。