Java - 我可以将String与lambda连接起来吗?怎么样?

时间:2017-09-06 14:25:37

标签: java string lambda concatenation

在Java中如何以正确的方式做这样的事情:

String a = "abc" + () -> { return "def";};

我理解上面的代码没有任何意义,但它代表了我真正的问题。

修改

首先发布此帖,意图获取并提供一些帮助;)

我实际上是在尝试连接函数的返回值

  

yshavit - 请记住,函数所产生的值是单独的概念 - 如果不是,则不需要两个构造

非常感谢,我真的不明白

真正的问题是我不(或不应该)编写方法“b”来返回此字符串,因为每次调用方法“a”时它只会执行一次。它甚至不会参数。

以下是真正的代码,以帮助理解:

    @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    final Connection connection;
    final Statement statement;
    final ResultSet result;
    final ResultSetMetaData meta;
    final int cols;
    final String[] labels;
    final HttpSession session = request.getSession(false);
    final String table = request.getParameter("table");

    response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(
            "<!DOCTYPE html>"
            + "<html>"
            + element("header.html")
            + "<body>"
                + "<nav class=\"sidepane\">"
                    + element("nav_hub.html")
                    //---------------------------------------------------here
                    + () -> { //where i'm trying to concatenate
                        try {
                                    Class.forName("com.mysql.jdbc.Driver");
                                    connection = (Connection) session.getAttribute("connection");
                                    statement = connection.createStatement();
                                    result = statement.executeQuery("SELECT * FROM " + table);
                                    meta = result.getMetaData();
                                    cols = meta.getColumnCount();
                                    labels = new String[cols];

                                    // ESCREVE A TABELA
                                    writer.write("<thead><tr>"); //header
                                    for (int i = 0; i < cols; i++) {
                                        labels[i] = meta.getColumnLabel(i + 1);
                                        writer.write("<th>" + labels[i].toUpperCase() + "</th>");
                                    }
                                    writer.write("</tr></thead><tbody>"); //body
                                    while (result.next()) {
                                        writer.write("<tr>");
                                        for (String column : labels) {
                                            writer.write("<td");
                                            if (meta.isWritable(1)) {writer.write(" contenteditable='true' ");}
                                            writer.write(">" + result.getString(column) + "</td>");
                                        }
                                        writer.write("</tr>");
                                    }
                                    writer.write("</tbody>");
                                } catch (SQLException | ClassNotFoundException e) {
                                    writer.write("erro ao ler banco de dados: " + e.getMessage());
                                }
                    }
                    //--------------------------------------------------------
                + "</nav>"
            + "</body>"
            + "</html>"
    );

}

现在,通过yshavit回答,我明白我不能使用lambda作为返回值。我仍然不知道如何使用lambda的返回并连接到其他字符串(不创建方法)。

Obs。:如果您想知道,有理由不使用jsp。

2 个答案:

答案 0 :(得分:-1)

lambda必须依赖功能界面 这是为这个功能接口的单一无抽象方法提供实现的简短方法。

所以你不能以这种方式使用。

如果您有一个方法将Supplier功能接口作为参数,您可以通过传递此lambda来调用它:

public static void main(String[] args) {
   String a = "abc" + supply(() -> { return "def";});
}

private static String supply(Supplier<String> supplier) {
   return supplier.get();
}

答案 1 :(得分:-1)

yshavit:

  

您尝试做的事情在Java中并不容易/自然。您基本上是在尝试编写一个创建并立即调用方法的表达式,基本上是将一堆语句组合在一起(并提供一个封闭的范围)以获取单个值。这不是一个不合理的事情,在JavaScript中它是可能的(我认为它甚至被认为是体面的风格,虽然我不确定)。但Java没有为此设置。您最好的选择是为该try块创建一个真正的非lambda函数。 (奖励:它会缩小,更容易阅读。)

解决了我的问题