我正在研究一种Java方法,该方法接收项目列表,为每个项目生成一个报告(PDF文件),最后将所有这些PDF文件压缩为一个zip文件。
这是我的简化方法:
List<File> pdfs = new ArrayList<File>();
public void generateZipOfItems(List<Item> items) {
for(Item item : items) {
ReportThread report = generatePDFReport(item);
report.addListener(new ReportExecuteListener() {
@Override
public void finishReport(ReportExecutionEvent reportExecutionEvent) {
// when report is finished, add the PDF file on arrayList
pdfs.add(reportExecutionEvent.getReport());
}
}
createZipFromFileList(pdfs); // this method just zip the files, and it is working very well
}
在理想情况下,该方法应生成项目A的报告,将其添加到“ pdfs”数组中,并重复执行项目B,C等。最后,所有pdf都放在数组中,应该将文件压缩。
问题是,循环没有等待侦听器完成生成报告文件,并且正在创建不包含项目的zip文件。
循环应在迭代之前等待侦听器。我该怎么办?
答案 0 :(得分:-1)
我会使用并行流。像这样:
createZipFileFromFileList(items.parallelStream()
.map(item -> generatePDFReport(item))
.collect(Collectors.toList()));
编辑:在此重构中,generatePDFReport()
将返回生成的PDF对象本身,而不是ReportThread
。