从 Java 中的 lambda 表达式返回 JsonArray
Returning JsonArray from lambda expression in Java
我正在尝试从数据库中获取数据并将结果 return 传递给另一种方法。但是我得到 this enclosing scope must be final 错误。有人可以帮我解决这个问题吗?我附上了我的代码和错误的屏幕截图 line.Thanks
干杯
佐尔夫
您在代码的封闭范围内使用了一个对象。为此,您必须使 JsonArray
对象常量。 Java中的final
关键字用于声明常量值。因此,错误表明您必须完成(使常量) resultData
对象才能在 connection.query
范围内使用它。
因此,只需在代码第 60 行的 JsonArray
之前添加 final
关键字:
final JsonArray resultData = new JsonArray();
更新:
如果您不能将其声明为 final,则需要使用 this 博客中提到的解决方法。
您可以声明一个大小为 1 的 JsonArray 类型的数组,然后更改或使用数组第 0 个位置的值。这样,该对象将被声明为final,没有任何危害。
在第 60 行,声明 final JsonArray[] resultData = { new JsonArray() };
然后,在您希望使用值的任何地方使用 resultData[0]
或更改值 resultData[0] = value;
。它还使用单个 int 数据类型值,因此不会使用额外的内存。
这是您可以使用的编辑代码:
@Override
public JsonArray fetchAllPages*JDBCClient dbClient) {
LOG.fo("INSIDE fetchAllPages method ");
final JsonArray[] resultData = {new JsonArray()}; //created an array of type JsonArray
dbClient.getConnection(ar->{
if(ar.failed()) {
LOG.error("Could not open a database connection",ar.cause());
} else {
SQLCollection connectionh = ar.result();
connection.query("select * from test",rs->{
if(rs.failed()) {
LOG.error("Database preparation error",rs.cause());
} else {
for(JsonArray line:rs.result().getResults()) {
System.out.println("Table result: "+line.encode());
resultData[0]=line; //replaced resultData with resultData[0]
}
connection.close(done->{
if(done.failed()) {
throw new RuntimeException(done.cause());
}
});
}
});
}
});
return resultData[0]; //replaced resultData with resultData[0]
}
我正在尝试从数据库中获取数据并将结果 return 传递给另一种方法。但是我得到 this enclosing scope must be final 错误。有人可以帮我解决这个问题吗?我附上了我的代码和错误的屏幕截图 line.Thanks
干杯
佐尔夫
您在代码的封闭范围内使用了一个对象。为此,您必须使 JsonArray
对象常量。 Java中的final
关键字用于声明常量值。因此,错误表明您必须完成(使常量) resultData
对象才能在 connection.query
范围内使用它。
因此,只需在代码第 60 行的 JsonArray
之前添加 final
关键字:
final JsonArray resultData = new JsonArray();
更新:
如果您不能将其声明为 final,则需要使用 this 博客中提到的解决方法。
您可以声明一个大小为 1 的 JsonArray 类型的数组,然后更改或使用数组第 0 个位置的值。这样,该对象将被声明为final,没有任何危害。
在第 60 行,声明 final JsonArray[] resultData = { new JsonArray() };
然后,在您希望使用值的任何地方使用 resultData[0]
或更改值 resultData[0] = value;
。它还使用单个 int 数据类型值,因此不会使用额外的内存。
这是您可以使用的编辑代码:
@Override
public JsonArray fetchAllPages*JDBCClient dbClient) {
LOG.fo("INSIDE fetchAllPages method ");
final JsonArray[] resultData = {new JsonArray()}; //created an array of type JsonArray
dbClient.getConnection(ar->{
if(ar.failed()) {
LOG.error("Could not open a database connection",ar.cause());
} else {
SQLCollection connectionh = ar.result();
connection.query("select * from test",rs->{
if(rs.failed()) {
LOG.error("Database preparation error",rs.cause());
} else {
for(JsonArray line:rs.result().getResults()) {
System.out.println("Table result: "+line.encode());
resultData[0]=line; //replaced resultData with resultData[0]
}
connection.close(done->{
if(done.failed()) {
throw new RuntimeException(done.cause());
}
});
}
});
}
});
return resultData[0]; //replaced resultData with resultData[0]
}