多行 lambda

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() 部分添加多个语句。我尝试将它们括在括号中,但似乎不起作用。什么是正确的语法?

Era*_*ran 8

我假设此 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)


ETO*_*ETO 5

不要那样做。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)

  • 我最好的猜测是,有些人认为你的回答过于固执己见;最好解释一下为什么您认为多行 lambda 风格不好或存在其他问题,以支持它而不是断言您的观点。也就是说,我认为你的回答很有用,所以我投了赞成票。 (6认同)