在Java8流中转换代码
是否有任何简单的方法可以使用streams和forEach将此代码转换为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){
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));
});