簡體   English   中英

是否可以將 lambda 方法的返回值分配給 java 中的變量?

[英]Is it possible to assign the return of a lambda method to a variable in java?

我有一個函數,它使用動態數量的where子句構建 SQL 查詢。

SQL 查詢執行存儲在 ResultSet 中,我想在try with resource聲明此結果集。 但是,這需要聲明的元素實現AutoCloseable ,而String類型不需要。

我的想法是使用 lambda 方法,將其作為 executeQuery 的參數傳遞,以便將其返回用作 String 參數,如下所示:

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

            return query;
        });

        )

但這在executeQuery上給出了以下錯誤:

類型 Statement 中的方法 executeQuery(String) 不適用於參數 (() -> {})

以及() ->上的這個:

此表達式的目標類型必須是函數式接口

有沒有辦法做我想要實現的目標?

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將查詢的構造推遲到最后可能的時刻。 這可能比急切地構建它晚幾毫秒。

我相信您可以將 try-with-resources 用於結果集本身:

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

一般來說,你可以使用像 JDBC Template of spring 或 JDBI 這樣的庫,而不是使用相當低級的(因此很痛苦;))JDBC

如果您完全需要使用普通 JDBC 運行查詢,請考慮閱讀這篇文章

它朝這個方向更進了幾步,並提出了非常有趣的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM