在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。
答案 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函数。 (奖励:它会缩小,更容易阅读。)
解决了我的问题