Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java8流中转换代码_Java_Java 8_Coding Style_Refactoring - Fatal编程技术网

在Java8流中转换代码

在Java8流中转换代码,java,java-8,coding-style,refactoring,Java,Java 8,Coding Style,Refactoring,是否有任何简单的方法可以使用streams和forEach将此代码转换为Java8 List<List<IStitchable>> listOfEnvelopes = new ArrayList<>(); List<IStitchable> statementsInEnvelope = new ArrayList<>(); int totalPages = 0; for(byte[] byteArray :byteArrays){

是否有任何简单的方法可以使用streams和forEach将此代码转换为Java8

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));
} 
我试着做一些类似的事情

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));
});
但是我不能在ForEach中使用totalPages和StatementSineLope, 无法从forEach作用域访问它们
最后,有没有更干净的方法来重构这个东西。任何想法都将不胜感激。

最简单的解决方案是使用AtomicInteger:


但即使这样也不能解决在forEach中访问invelope语句的问题。它在forEach.make语句Invelop final的范围之外声明?是的,它确实解决了这个问题。请注意,我将作业改为clear@AdamSiemion我想你们可以用一个数组来代替AtomicInteger,它对于这种类型的数组来说太贵了problem@AdamSiemion更不用说forEach更新文档明确禁止的外部集合了。最干净的方法是旋转一个自定义收集器,例如:我质疑生成的代码是否比前一个更好。对可读性的影响是有争议的。另外,现在您正在为使用AtomicInteger额外分配、堆中的额外指针解引用、读取和更新volatile字段付出代价。这里最简单的事情是旋转自定义收集器,编写它并不复杂,下面是一个示例的参考:
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));
});