Замена объекта RowMapper на выражение lamda java 8

Я использую в своем проекте класс 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");
    };

Является ли это возможным???

что throws SQLException сделает преобразование более подробным

Eugene 04.04.2018 14:14
5
1
2 747
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

попробуй это

    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 является проверенным исключением

Eugene 04.04.2018 14:19
throw new RuntimeException(e)нетthrow RuntimeExcpetion(e) (также обратите внимание на вашу опечатку)
Eugene 04.04.2018 14:23
Ответ принят как подходящий

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).
srborlongan 04.04.2018 16:30

Лямбда-выражения не могут объявлять отмеченные исключения, но в этом нет необходимости. Функциональный интерфейс уже есть. Вы можете просто использовать (rs,rowNumber) -> { PersonDTO personDTO = new PersonDTO(); personDTO.setPerId(rs.getString("COL_ONE")); personDTO.setIdTypeCd(rs.getString("COL_TWO")); return personDTO; }

Holger 04.04.2018 19:33

@Holger: интерфейсный метод mapRow() выбрасывает sqlException, но поскольку мы его переопределяем, нам не нужно обрабатывать исключение в lambda ...

Kalanka 04.04.2019 06:08

@holger: тогда мы должны обрабатывать исключение, используя trycatch в lambda или throws исключение в parent method, где находится lambda exression.

Kalanka 04.04.2019 08:50

@Kalanka звонящий должен обрабатывать исключение, которое не обязательно является методом, содержащим лямбда-выражение. Итак, в этом примере это зависит от объявления query. Если этот метод объявляет исключение, потому что он передает исключения в теле лямбда-выражения вызывающему, тогда метод, вызывающий query, должен обработать исключение, которое здесь является содержащим методом. Согласно формальным правилам, он должен обрабатывать объявленное исключение, даже если вы поместите try … catch … в лямбда-выражение. Контрпример - executorService.submit(() -> /* throwing */)

Holger 04.04.2019 08:58

Другие вопросы по теме