Я использую в своем проекте класс Spring JdbcTemplate. У меня есть следующий код:
List<PersonDTO> personList = jdbcTemplate.query(query, new RowMapper<PersonDTO>() {
@Override
public PersonDTO mapRow(ResultSet rs, int rowNumber) throws SQLException {
PersonDTO personDTO = new PersonDTO ();
personDTO.setPerId(rs.getString("COL_ONE"));
personDTO.setIdTypeCd(rs.getString("COL_TWO"));
return personDTO;
}
});
Теперь я хочу заменить анонимный класс RowMapper на выражение lamda java8 примерно так:
Runnable r1 = () -> {
System.out.println("My Runnable");
};
Является ли это возможным???
попробуй это
List<PersonDTO> personList = jdbcTemplate.query(query, (rs,rowNumber) -> {
try
{PersonDTO personDTO = new PersonDTO ();
personDTO.setPerId(rs.getString("COL_ONE"));
personDTO.setIdTypeCd(rs.getString("COL_TWO"));
return personDTO;
}catch(SQLException e){
throw new RuntimeException("your error message",e) // or other unchecked exception here
}
});
как насчет SQLException, что IIRC является проверенным исключением
throw new RuntimeException(e)нетthrow RuntimeExcpetion(e) (также обратите внимание на вашу опечатку)
AFAIK RowMapper - это функциональный интерфейс, так что это сработает. лямбда-выражение не может объявлять проверенные исключения, поэтому вам нужно будет обернуть это ...
jdbcTemplate.query(query, (ResultSet rs, int rowNumber) -> {
PersonDTO personDTO = new PersonDTO ();
personDTO.setPerId(rs.getString("COL_ONE"));
personDTO.setIdTypeCd(rs.getString("COL_TWO"));
return personDTO;
});
Комментарии уместны: поскольку этот функциональный интерфейс уже объявляет о выбросе исключения, нет необходимости его перехватывать.
RowMapper::mapRow заявляет, что может генерировать SQLException, поэтому я предполагаю, что телу лямбда нет необходимости оборачивать выброшенные SQLException в RuntimeException (см. этот пример, где лямбда вызывает ResultSet::getString, метод генерирования SQLException).
Лямбда-выражения не могут объявлять отмеченные исключения, но в этом нет необходимости. Функциональный интерфейс уже есть. Вы можете просто использовать (rs,rowNumber) -> { PersonDTO personDTO = new PersonDTO(); personDTO.setPerId(rs.getString("COL_ONE")); personDTO.setIdTypeCd(rs.getString("COL_TWO")); return personDTO; }
@Holger: интерфейсный метод mapRow() выбрасывает sqlException, но поскольку мы его переопределяем, нам не нужно обрабатывать исключение в lambda ...
@holger: тогда мы должны обрабатывать исключение, используя trycatch в lambda или throws исключение в parent method, где находится lambda exression.
@Kalanka звонящий должен обрабатывать исключение, которое не обязательно является методом, содержащим лямбда-выражение. Итак, в этом примере это зависит от объявления query. Если этот метод объявляет исключение, потому что он передает исключения в теле лямбда-выражения вызывающему, тогда метод, вызывающий query, должен обработать исключение, которое здесь является содержащим методом. Согласно формальным правилам, он должен обрабатывать объявленное исключение, даже если вы поместите try … catch … в лямбда-выражение. Контрпример - executorService.submit(() -> /* throwing */)
что
throws SQLExceptionсделает преобразование более подробным