解决/处理列表的最佳方法<;完全未来<;列表<;对象>&燃气轮机&燃气轮机;在Java8中

解决/处理列表的最佳方法<;完全未来<;列表<;对象>&燃气轮机&燃气轮机;在Java8中,java,java-8,java-stream,completable-future,Java,Java 8,Java Stream,Completable Future,代码: SpringBean代码段: @Component class myService { private CSVFileProcessor csvFileProcessor; public myService(CSVFileProcessor csvFileProcessor) { this.csvFileProcessor=csvFileProcessor; } /* input: List of promises/futures obtained

代码: SpringBean代码段:

@Component
class myService {

 private CSVFileProcessor csvFileProcessor;

 public myService(CSVFileProcessor csvFileProcessor) {

         this.csvFileProcessor=csvFileProcessor;

    }

/* input: List of promises/futures obtained by reading 
 *   csv files from S3 bucket
 * 
 * output: List of promises of list of parsed csv 
 *   documents converted to POJO's of type Document
 *  
 *
 */
  @Async
  public List<CompletableFuture<List<Document>>> createDocumentObjects(
      List<CompletableFuture<ResponseBytes<GetObjectResponse>>> documentsFuture) {

 return documentsFuture.stream().map(myDocument-> myDocument.thenCompose(document-> CompletableFuture.supplyAsync(
                 () ->   csvFileProcessor.parseObjects(document)))).collect(Collectors.toList());

}
@组件
类myService{
专用CSVFileProcessor CSVFileProcessor;
公共myService(CSVFileProcessor CSVFileProcessor){
this.csvFileProcessor=csvFileProcessor;
}
/*输入:通过阅读获得的承诺/未来列表
*来自S3 bucket的csv文件
* 
*输出:解析csv列表的承诺列表
*转换为文档类型POJO的文档
*  
*
*/
@异步的
公共列表createDocumentObjects(
列表文档(未来){
返回documentsFuture.stream().map(myDocument->myDocument.thenCompose(document->CompletableFuture.SupplySync(
()->csvFileProcessor.parseObjects(document)).collect(collector.toList());
}
因此,在服务层中,我注入上述bean并尝试执行以下操作:

List<CompletableFuture<List<Document>>> listOfPromises= injectedBean.createDocumentObjects(input);

//The below code throws NPE(Null pointer exception) 
List<List<Document>> myDocuments =listOfPromises.stream().map(CompletableFuture::join).collect(Collectors.toList());
List listOfPromises=injectedBean.createDocumentObjects(输入);
//下面的代码抛出NPE(空指针异常)
List myDocuments=listOfPromises.stream().map(CompletableFuture::join).collect(Collectors.toList());
listOfPromises
似乎为空。我检查了
csvFileProcessor
类的日志,输入正在按预期进行处理。尝试向未来调用添加异常和句柄块,但在尝试解决承诺时,仍然没有从同一NPE之外的位置引发异常

我确信我遗漏了一些琐碎的东西,任何正确方向的指导都会非常有用。

根据:

就目标方法签名而言,支持任何参数类型。但是,返回类型被限制为
void
Future
。在后一种情况下,您可以声明更具体的
ListenableFuture
CompletableFuture
类型,以便与异步方法进行更丰富的交互任务,并通过进一步的处理步骤进行即时合成

您的方法都不返回,因此Spring不知道如何处理它。不幸的是,它没有给出错误,而是接受调用,将方法执行延迟到单独的线程,并立即返回
null


然而,这里似乎并不真正需要
@Async
,因为您的方法正在处理异步执行本身(通过组合和
supplyAsync()
),所以您可能只需删除注释即可解决问题。

listOfPromises
似乎为空”,你确定吗?给定代码,看起来不像,因为
collect(Collectors.toList())
不会返回
null
injectedBean.createDocumentObjects(输入)如果
injectedBean
null
,那么
可能会将NPE抛出另一行。这可能是因为您的实际代码不是问题中的样子吗?@Naman是的,这正是我拥有的代码。我通过做一些不同的事情来解决问题,但仍然无法理解为什么会出现上述代码从来没用过。哇,这真是个好机会!我从来都不知道。谢谢你这么清楚的解释。