2017-08-12 175 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

我们正在使用番石榴 –