在 Java 8 个流中转换代码
Converting code in Java 8 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
和 statementsInEnvelope
,
不能从 forEach 范围访问它们
最后有没有更简洁的方法来重构这个东西。任何想法将不胜感激。
最简单的解决方案是使用 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));
});
有什么简单的方法可以使用流和 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
和 statementsInEnvelope
,
不能从 forEach 范围访问它们
最后有没有更简洁的方法来重构这个东西。任何想法将不胜感激。
最简单的解决方案是使用 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));
});