Многострочная лямбда - PullRequest
       17

Многострочная лямбда

3 голосов
/ 11 февраля 2020

У меня есть этот код, который работает:

  new JdbcTemplate(new SingleConnectionDataSource(c, true))
        .query("select id, name from PLAYERS", (rs, rowNum) ->
            new Player(rs.getString("id"), rs.getString("name")) // oneline
        );

Однако теперь мне нужно добавить несколько операторов в новую часть Player (). Я попытался заключить их в квадратные скобки, но это не сработало. Какой правильный синтаксис?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Я предполагаю, что метод функционального интерфейса, реализуемый этим лямбда-выражением, имеет возвращаемое значение, поэтому при использовании скобок он должен включать инструкцию возврата, как и любой метод с не возвращаемым типом возврата.

new JdbcTemplate(new SingleConnectionDataSource(c, true))
    .query("select id, name from PLAYERS", (rs, rowNum) ->
        {
            return new Player(rs.getString("id"), rs.getString("name");
        }) 
    );
0 голосов
/ 12 февраля 2020

Не делайте этого. Наличие нескольких операторов в lambda в большинстве случаев является запахом кода . Скорее создайте метод с двумя параметрами:

private Player toPlayer(ResultSet rs, int rowNum) {
    // multiple setters here
    return player;
}

и затем передайте method reference (который на самом деле будет вести себя как BiFunction) вместо lambda:

new JdbcTemplate(new SingleConnectionDataSource(c, true))
    .query("select id, name from PLAYERS", this::toPlayer);

Можно хотеть создать вспомогательный метод stati c вместо динамического c. Логика c такая же, как указано выше:

public class MappingUtil {
    // ...
    public static Player toPlayer(ResultSet rs, int rowNum) {
        // multiple setters here
        return player;
    }
}

А затем:

new JdbcTemplate(new SingleConnectionDataSource(c, true))
    .query("select id, name from PLAYERS", MappingUtil::toPlayer);
...