[英]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.