【发布时间】:2017-12-08 15:45:33
【问题描述】:
是否有任何简单的方法可以使用流和 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));
}
我试图做类似的事情
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 和 statementsInEnvelope,
无法从 forEach 范围访问它们
最后有没有更简洁的方法来重构这个东西。任何想法将不胜感激。
【问题讨论】:
-
我在质疑生成的代码是否比前一个更好。对可读性的影响是有争议的。此外,现在您正在为使用 AtomicInteger 付出代价(额外分配、堆中的额外指针取消引用、读取和更新 volatile 字段)
-
这里“最简单”的事情是旋转一个自定义收集器,编写它并不复杂,这里有一个参考,例如:stackoverflow.com/questions/47645399/…
标签: java java-8 coding-style refactoring