如何使用foreach中被调用函数的返回值

时间:2019-06-09 01:47:31

标签: java

在我的函数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;

}

2 个答案:

答案 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()工作原理的很好的教程。