在Java中从lambda表达式返回JsonArray

在Java中从lambda表达式返回JsonArray,java,vert.x,Java,Vert.x,我试图从数据库中获取数据,并将结果返回给另一个方法。但我得到这个封闭范围一定是最后的错误。有人能帮我解决这个问题吗。我已经附上了我的代码和错误行的屏幕截图。谢谢 干杯 Zolf您正在代码中使用封闭范围内的对象。为此,必须使JsonArray对象为常量。Java中的final关键字用于声明常量值。因此,错误表明您必须完成(使常量化)resultData对象,以便在连接中使用它。query范围。 因此,只需在代码第60行的JsonArray之前添加final关键字: final JsonArray

我试图从数据库中获取数据,并将结果返回给另一个方法。但我得到这个封闭范围一定是最后的错误。有人能帮我解决这个问题吗。我已经附上了我的代码和错误行的屏幕截图。谢谢 干杯
Zolf

您正在代码中使用封闭范围内的对象。为此,必须使
JsonArray
对象为常量。Java中的
final
关键字用于声明常量值。因此,错误表明您必须完成(使常量化)
resultData
对象,以便在
连接中使用它。query
范围。
因此,只需在代码第60行的
JsonArray
之前添加
final
关键字:

final JsonArray resultData=new JsonArray();
更新:
如果不能将其声明为最终版本,则需要使用博客中提到的解决方法。
您可以声明大小为1的JsonArray类型的数组,然后更改或使用数组第0位的值。通过这种方式,该对象将被宣布为最终对象,不会造成任何损害。
在第60行中,声明
final JsonArray[]resultData={new JsonArray()}
然后,使用
resultData[0]
无论您希望在何处使用该值或更改该值
resultData[0]=value。它还使用单个int数据类型值,因此不会使用额外的内存

以下是您可以使用的已编辑代码:

@覆盖
公共JsonArray fetchAllPages*JDBCClient(dbClient){
fo(“内部fetchAllPages方法”);
final JsonArray[]resultData={new JsonArray()};//创建了JsonArray类型的数组
dbClient.getConnection(ar->{
if(ar.failed()){
LOG.error(“无法打开数据库连接”,ar.cause());
}否则{
SQLCollection connectionh=ar.result();
connection.query(“从测试中选择*”,rs->{
如果(rs.failed()){
LOG.error(“数据库准备错误”,rs.cause());
}否则{
for(JsonArray行:rs.result().getResults()){
System.out.println(“表结果:+line.encode());
resultData[0]=行;//将resultData替换为resultData[0]
}
连接。关闭(完成->{
if(done.failed()){
抛出新的RuntimeException(done.cause());
}
});
}
});
}
});
返回resultData[0];//将resultData替换为resultData[0]
}

感谢您的反馈。事实上,这是我做的第一件事,但它给了我另一个错误,即无法分配最终的局部变量resultData。它必须是空的,并且不使用复合赋值。你应该在问题中提到整个问题。请参阅我的编辑。数据库将返回大约100条记录,我需要在第74行的for循环中捕获它,然后返回JSONArrayTanks以获得您的帮助!!。当我返回resultData时,它是空的,另一个问题是我需要发送resultData数组中的所有100个值,但现在它只返回0索引。您应该了解异步编程,在阅读/观看解释异步编程和同步编程之间差异的指南之前,不要试图编写代码,否则您将陷入困境,最终会憎恨异步编程/反应式编程:)阅读承诺、非阻塞代码、lambdas等,了解异步编程在何处出现感谢您的反馈,你能给我介绍一些关于异步的好资源吗