【问题标题】:Is it possible to assign the return of a lambda method to a variable in java?是否可以将 lambda 方法的返回值分配给 java 中的变量?
【发布时间】: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

标签: java lambda java-8


【解决方案1】:

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&lt;String&gt; 签名,这将允许Statement 将查询的构建推迟到最后可能的时刻。这可能比急切构建的要晚几毫秒。

【讨论】:

    【解决方案2】:

    我相信您可以将 try-with-resources 用于结果集本身:

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

    一般来说,您可以使用诸如 spring 的 JDBC 模板或 JDBI 之类的库,而不是使用相当低级的(因此很痛苦;)) JDBC

    如果您完全需要使用普通 JDBC 运行查询,请考虑阅读 this article

    它在这个方向上更进一步,并提出了非常有趣的解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2020-01-07
      相关资源
      最近更新 更多