【发布时间】:2020-03-03 21:01:32
【问题描述】:
我有一个使用动态数量的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)不是 适用于参数 (() -> {})
以及() ->上的这个:
这个表达式的目标类型必须是函数式接口
有没有办法做我想要实现的目标?
【问题讨论】:
-
由于
String不等同于FunctionaInterface,因此无法编译。只需调用为您构造query的方法即可。 -
@Naman 这是一个解决方案。但实际上是什么阻止我在 lambda 中做到这一点?
-
类型推断和进一步的不匹配会阻止您这样做。例如您甚至不能使用相同的签名致电
s.executeQuery(10)。因为String不是Integer,也不是FunctionalInterface