Возврат JsonArray из лямбда-выражения в Java - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь получить данные из базы данных и вернуть результаты другому методу. Но я понимаю, что это заключительная ошибка. Может ли кто-нибудь помочь мне решить эту проблему. Я прикрепил снимок экрана с моим кодом и строкой с ошибкой. Спасибо Cheers Zolf введите описание изображения здесь

1 Ответ

0 голосов
/ 14 июля 2020

Вы используете объект в пределах области видимости в вашем коде. Для этого необходимо сделать объект JsonArray постоянным. Ключевое слово final в Java используется для объявления постоянного значения. Итак, ошибка говорит о том, что вы должны завершить (сделать постоянным) объект resultData, чтобы использовать его внутри этой connection.query области. Итак, просто добавьте ключевое слово final перед JsonArray в строке 60 вашего кода:

final JsonArray resultData = new JsonArray();

UPDATE: Если вы не можете объявить его окончательным, вам нужно использовать обходной путь, как указано в этом блоге. Вы можете объявить массив типа JsonArray размером 1, а затем изменить или использовать значение в 0-й позиции массива. Таким образом, объект будет объявлен окончательным без какого-либо ущерба. В строке 60 объявите final JsonArray[] resultData = { new JsonArray() }; Затем используйте resultData[0] везде, где вы sh, чтобы использовать значение или изменить значение 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]
}
...