Bob*_*bJI 5 java java-8 functional-interface
我有这个代码,它有效:
new JdbcTemplate(new SingleConnectionDataSource(c, true))
.query("select id, name from PLAYERS", (rs, rowNum) ->
new Player(rs.getString("id"), rs.getString("name")) // oneline
);
Run Code Online (Sandbox Code Playgroud)
但是我现在需要在新的 Player() 部分添加多个语句。我尝试将它们括在括号中,但似乎不起作用。什么是正确的语法?
我假设此 lambda 表达式实现的函数接口的方法有一个返回值,因此在使用括号时,它应该包含一个 return 语句,就像任何具有非 void 返回类型的方法一样。
new JdbcTemplate(new SingleConnectionDataSource(c, true))
.query("select id, name from PLAYERS", (rs, rowNum) ->
{
return new Player(rs.getString("id"), rs.getString("name");
})
);
Run Code Online (Sandbox Code Playgroud)
不要那样做。lambda在大多数情况下,在 a 中包含多个语句会产生代码异味。而是创建一个具有两个参数的方法:
private Player toPlayer(ResultSet rs, int rowNum) {
// multiple setters here
return player;
}
Run Code Online (Sandbox Code Playgroud)
然后传递method reference(实际上它的行为类似于BiFunction) 而不是lambda:
new JdbcTemplate(new SingleConnectionDataSource(c, true))
.query("select id, name from PLAYERS", this::toPlayer);
Run Code Online (Sandbox Code Playgroud)
人们可能想要创建一种静态实用方法而不是动态方法。逻辑与上面相同:
public class MappingUtil {
// ...
public static Player toPlayer(ResultSet rs, int rowNum) {
// multiple setters here
return player;
}
}
Run Code Online (Sandbox Code Playgroud)
进而:
new JdbcTemplate(new SingleConnectionDataSource(c, true))
.query("select id, name from PLAYERS", MappingUtil::toPlayer);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2711 次 |
| 最近记录: |