在我的函数doDecoration中,我想遍历pdfAttachments列表并调用函数addToPdf。在那里将创建一个新的pdf,这个应该是新的decoratedDataAsByte,以便下一个元素将使用这个新的pdf作为输入。目前,我不知道如何使用foreach函数。
这是我的代码
public byte[] doDecoration(byte[] decoratedDataAsByte, RendererConfiguration config, List<IReadonlyPersistedAttachment> pdfAttachments) {
pdfAttachments.stream()
.forEach(att -> addToPdf(config, att, decoratedDataAsByte));
return decoratedDataAsByte;
}
private byte[] addToPdf(RendererConfiguration config, IReadonlyPersistedAttachment att, byte[] decoratedDataAsByte) {
byte[] addedPdf = decoratedDataAsByte;
if (config.getAddPdfAtBegin().contains(att.getAttName())){
addedPdf = PdfUtils.addPdfAtBegin(decoratedDataAsByte, att.getBinary().getBinaryData());
}
else if (config.getAddPdfAtEnd().contains(att.getAttName())){
addedPdf = PdfUtils.addPdfAtEnd(decoratedDataAsByte, att.getBinary().getBinaryData());
}
else{
addedPdf = PdfUtils.addPdfAtEnd(decoratedDataAsByte, att.getBinary().getBinaryData());
}
return addedPdf;
}
答案 0 :(得分:2)
解决您问题的最简单方法是不使用foreach(),因为lambda exp中使用的变量应该是最终的,或者实际上是最终的。
for (IReadonlyPersistedAttachment pdfAttachment : pdfAttachments) {
decoratedDataAsByte = addToPdf(config, att, decoratedDataAsByte);
}
return decoratedDataAsByte;
您可以通过声明局部有效的最终变量来解决最终变量问题,但我不建议您这样做:
final byte[][] finalPDFBytes = {decoratedDataAsByte};
pdfAttachments.forEach(att -> finalPDFBytes[0] = addToPdf(config, att, finalPDFBytes[0]));
return finalPDFBytes[0];
答案 1 :(得分:0)
如果我了解您要正确执行的操作,听起来更像是reduce
操作,而不是foreach
。这未经测试,但应该为您指明正确的方向。
public byte[] doDecoration(byte[] decoratedDataAsByte, RendererConfiguration config, List<IReadonlyPersistedAttachment> pdfAttachments) {
return pdfAttachments.stream()
.reduce(
decoratedDataAsByte,
(att, combined) -> addToPdf(config, att, combined));
}
This是关于Stream#reduce()
工作原理的很好的教程。