2017-08-12 92 views
1

以下代碼將對象流拆分爲1000塊,在實例化過程中處理它們,並返回最後的對象總數。StreamEx分組到列表返回不正確的記錄數

在號碼返回的所有情況下是正確的,除非該流的大小恰好是1.在流大小爲1的情況下,返回的數是0。

任何幫助,將不勝感激。在流中沒有記錄爲0的情況下,我也必須破解返回調用。我想解決這個問題。

AtomicInteger recordCounter = new AtomicInteger(0); 
try (StreamEx<MyObject> stream = StreamEx.of(myObjects)) { 
     stream.groupRuns((prev, next) -> recordCounter.incrementAndGet() % 1000 != 0) 
       .forEach((chunk) -> 
         { 
          //... process each chunk 
         } 
      ); 
    } catch(Exception e) { 
     throw new MyRuntimeException("Failure streaming...", e); 
    } finally { 
     myObjects.close(); 
    } 

return recordCounter.get() == 0 ? 0 : recordCounter.incrementAndGet(); 
+0

你爲什麼要返回'計數器+ 1'而不是'counter'? – wargre

+0

因爲否則它總是返回1比它應該少。 –

回答

0

在我與番石榴的Iterators.partition()跑到我的對象的流分割成塊的結尾:

MutableInt recordCounter = new MutableInt(); 
try { 
    Iterators.partition(myObjects.iterator(), 1000) 
      .forEachRemaining((chunk) -> { 
         //process each chunk 
         ... 
         recordCounter.add(chunk.size()); 
      }); 
} catch (Exception e) { 
    throw new MyRuntimeException("Failure streaming...", e); 
} finally { 
    myObjects.close(); 
} 

return recordCounter.getValue(); 
0

Originally計數器來知道什麼時候拆塊,這是不可靠的計算對象的總數。當流的大小爲0或1時groupRuns函數未執行。

所以你需要另一種方法來計算對象。相反,在forEach只是消費項目,你可以返回對象的數量到底

AtomicInteger counter = new AtomicInteger(0); 
    try (StreamEx<MyObject> stream = StreamEx.of(myObjects)) { 
     return stream 
       .groupRuns((prev, next) -> counter.incrementAndGet() % 1000 != 0) 
       .mapToLong((chunk) -> { 
        //... process each chunk 
        return chunk.size(); 
       }) 
       .sum(); 
    } catch(Exception e) { 
     throw new MyRuntimeException("Failure streaming...", e); 
    } finally { 
     myObjects.close(); 
    } 
+0

好的,繼續下去 - 您在上面提到的更改爲原始方法增加了100%的執行時間。它解決了這個問題,但方式太長了! –

0

@Nazarii Bardiuk解釋,爲什麼它不工作處理chunk.size()sum他們。我遇到了類似的要求來拆分流。所以我分叉它並做了一些更改:StreamEx-0.8.7。下面是一個簡單的例子:

int count = IntStreamEx.range(0, 10).boxed().splitToList(3).mapToInt(chunk -> { 
    System.out.println(chunk); 
    return chunk.size(); 
}).sum(); 

System.out.println(count); 

如果你在開始你的項目,你可以試一試,代碼將是:

try (StreamEx<MyObject> stream = StreamEx.of(myObjects).onClose(() -> myObjects.close())) { 
    return stream.splitToList(1000) 
       .mapToInt((chunk) -> { 
           //... process each chunk 
        return chunk.size(); 
        }).sum(); 
} 
1

由於JavaDoc說:

sameGroup - 適用於相鄰元素對的非干擾,無狀態謂詞,對於屬於同一組的元素返回true。

謂詞必須是無狀態的,這不是你的情況。你濫用這個方法,這就是爲什麼你不能得到預期的結果。它靠近你想要的純粹偶然的工作,你不能依賴這種行爲,它在未來的StreamEx版本中可能會改變。

+0

我們正在使用番石榴 –