从 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]
}