用 java 8 lambda 表达式替换 RowMapper 对象

Replacing RowMapper object with java 8 lamda expression

我在 project.I 中使用 Spring JdbcTemplate class 具有以下代码:

       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;
            }
        });

现在我想将匿名 class RowMapper 替换为 java8 lamda 表达式,如下所示:

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
               }
        });

AFAIK RowMapper 是一个功能接口,所以这会起作用。 lambda 表达式无法声明已检查的异常,因此您需要将其包装起来...

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;
});

评论很到位:因为那个函数式接口已经声明抛出异常,所以没有必要捕获它。