首页 > 解决方案 > 从 Java 中的 lambda 表达式返回 JsonArray

问题描述

我正在尝试从数据库中获取数据并将结果返回给另一种方法。但我得到这个封闭范围必须是最终错误。有人可以帮我解决这个问题。我附上了我的代码和错误行的屏幕截图。谢谢 Cheers Zolf在此处输入图像描述

标签: javavert.x

解决方案


您正在代码的封闭范围内使用对象。为此,您必须使JsonArray对象保持不变。Java中的final关键字用于声明一个常量值。因此,错误表明您必须完成(使常量)resultData对象才能在该connection.query范围内使用它。
因此,只需在代码的第 60 行中添加final关键字 before :JsonArray

final JsonArray resultData = new JsonArray();

更新:
如果您不能将其声明为最终版本,则需要使用博客中提到的解决方法。
您可以声明一个大小为 1 的 JsonArray 类型的数组,然后更改或使用数组第 0 位的值。这样,该对象将被宣布为最终对象,而不会造成任何伤害。
在第 60 行,声明final JsonArray[] resultData = { new JsonArray() }; Then,使用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]
}

推荐阅读