解决/处理列表的最佳方法<;完全未来<;列表<;对象>&燃气轮机&燃气轮机;在Java8中
代码: SpringBean代码段:解决/处理列表的最佳方法<;完全未来<;列表<;对象>&燃气轮机&燃气轮机;在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
@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是的,这正是我拥有的代码。我通过做一些不同的事情来解决问题,但仍然无法理解为什么会出现上述代码从来没用过。哇,这真是个好机会!我从来都不知道。谢谢你这么清楚的解释。