Можно ли присвоить возврат лямбда-метода переменной в java? - PullRequest
1 голос
/ 03 марта 2020

У меня есть функция, которая создает запрос SQL с динамическим c количеством where предложений.

Оформление запроса SQL сохраняется в ResultSet, я хотел бы объявить этот результат установлен в try with resource. Однако для этого требуется, чтобы объявленные элементы реализовывали AutoCloseable, а тип String - нет.

Моя идея состояла в том, чтобы использовать лямбда-метод, передать его в качестве параметра executeQuery, чтобы использовать его возвращаемый результат. в качестве параметра String, например, так:

try (Statement s = getStatement(); 
        String test = "test";
        ResultSet rs = s.executeQuery(() -> {
            String query = "build y query here";

            return query;
        });

        )

Но это дает следующую ошибку на executeQuery:

Метод executeQuery (String) в операторе типа не применим для аргументов (() -> {})

Как и для () ->:

целевой тип этого выражения должен быть функциональным интерфейсом

Есть ли способ сделать то, чего я хочу достичь?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Я полагаю, что вы можете использовать try-with-resources для самого набора результатов:

try (PreparedStatement ps = connection.prepareStatement(sql)) {
    setupParams(ps, params);
    try (ResultSet rs = ps.executeQuery()) {
        while (rs.next()) {
              // process the row                    
        }
    } 
} 

В общем, вместо того, чтобы работать с довольно низкоуровневым (и, следовательно, болезненным;)) JDB C, вы могли бы используйте библиотеки, такие как JDB C Template of Spring или JDBI

Если вам полностью необходимо выполнить запросы с простым JDB C, рассмотрите чтение этой статьи

It делает еще несколько шагов в этом направлении и предлагает довольно интересное решение

1 голос
/ 03 марта 2020

executeQuery принимает строку. Это не займет Supplier<String> или что-нибудь подобное. Требуется, чтобы запрос был предоставлен с нетерпением. Наиболее близким к тому, что вы предлагаете, будет:

Supplier<String> supplier = () -> {
    String query = "build y query here";

    return query;
};
ResultSet rs = s.executeQuery(supplier.get());

Поскольку поставщик не может быть оценен лениво, ограниченный сигнатурами, которые предоставляет Statement, в этом нет абсолютно никакой ценности. Вы также можете просто извлечь это из метода.

ResultSet rs = s.executeQuery(buildQuery());

// ...

String buildQuery() {
    String query = "build y query here";

    return query;
}

Теоретически, они могут добавить сигнатуру Supplier<String>, которая позволит Statement отложить построение запроса до последнего возможного момента. Скорее всего, это будет на порядок миллисекунд позже, чем если бы он был построен с нетерпением.

...