简体   繁体   English

在Java 8流中转换代码

[英]Converting code in Java 8 streams

Is there any easy way to convert this code into java 8 using streams and forEach. 是否有任何简单的方法可以使用流和forEach将此代码转换为Java 8。

List<List<IStitchable>> listOfEnvelopes = new ArrayList<>();
List<IStitchable> statementsInEnvelope = new ArrayList<>();
int totalPages = 0;

for(byte[] byteArray :byteArrays){
    totalPages = totalPages + getPagesInDocument(byteArray);

    if(totalPages/2>MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){
        totalPages = 0;
        listOfEnvelopes.add(statementsInEnvelope);
        tatementsInEnvelope = new ArrayList<IStitchable>();
    }

    statementsInEnvelope.add(createStitchableFromSnapshot(byteArray));
} 

I tried to do something like 我试图做类似的事情

byteArrays.stream().forEach(byteArray->{
    totalPages = totalPages + getPagesInDocument(byteArray);            
    if(totalPages/2>MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){
        totalPages = 0;
        listOfEnvelopes.add(statementsInEnvelope);
        statementsInEnvelope = new ArrayList<IStitchable>();
    }
    statementsInEnvelope.add(createStitchableFromSnapshot(byteArray));
});

but then I cannot use totalPages and statementsInEnvelope within ForEach, they cannot be accessed from the forEach scope 但是我无法在ForEach中使用totalPagesstatementsInEnvelope ,因此无法从forEach范围访问它们
Lastly is there any cleaner way to refactor this thing. 最后,有没有更干净的方法来重构这个东西。 Any ideas would be appreciated. 任何想法,将不胜感激。

The simplest solution is to use AtomicInteger : 最简单的解决方案是使用AtomicInteger

List<List<IStitchable>> listOfEnvelopes = new ArrayList<>();     
List<IStitchable> statementsInEnvelope = new ArrayList<>();
AtomicInteger totalPages = new AtomicInteger();

byteArrays.stream().forEach(byteArray -> {
  totalPages.addAndGet(getPagesInDocument(byteArray));

  if(totalPages.get() / 2 > MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){
    totalPages.set(0);
    listOfEnvelopes.add(new ArrayList<>(statementsInEnvelope));
    statementsInEnvelope.clear();
  }
  statementsInEnvelope.add(createStitchableFromSnapshot(byteArray));
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM