Usando Lambdas

En esta breve entrada explicare como mejorar el ejemplo anterior, con el uso de lambdas.

Como siempre el código fuente de este ejemplo lo tenéis en: https://github.com/chuchip/jdbc_jpa_tomcat

Las lambdas, son un mecanismo introducido en Java 8, pero que realmente en el mundo de la programación no es nuevo.

Gracias a las lambdas se puede entre otras cosas, evitar, en gran medida el uso de las clases auxiliares. Tenéis muchos manuales en la web, solo preguntarle a google, que lo sabe ‘casi’ todo ;-), pero os aconsejo que le echéis un vistazo al siguiente enlace:

https://www.oracle.com/technetwork/es/articles/java/expresiones-lambda-api-stream-java-2633852-esa.html

Yo, lo que os voy a dar un ejemplo de como usar lambda, para mejorar el uso de Swing Data JDBC. ¡¡Vamos a ello!!.

En nuestra clase anterior teníamos el siguiente código:

public class JdbcEjemplo {
.....
       
    public List<Usuario> findAllUsernames() {
        return jdbc.queryForObject(
                "select login,nombre from usuario ",
                new usuarioListaRowMapper() );
    }
   
   private  class usuarioListaRowMapper implements RowMapper<List<Usuario>> {

        @Override
        public List<Usuario> mapRow(ResultSet rs, int rowNum) throws SQLException {
            ArrayList<Usuario> listaUsuarios = new ArrayList();
            do
            {
                listaUsuarios.add(new Usuario(rs.getString("login"),
                                    rs.getString("nombre")));

            } while (rs.next());
            return listaUsuarios;
        }
    }
}

Ahora vamos a ver como usar una expresion lambda de tal manera que no tengamos que crear la clase usuarioListaRowMapper y, ademas nuestro código quede mucho mas limpio.

public List<Usuario> findAllUsernames() {
         return  jdbc.query(
                "select login,nombre from usuario ",
                (rs, rowNum) -> new Usuario(rs.getString("login"),rs.getString("nombre"))
        );
}

¿ Sorprendido ?. Sí, gracias al uso de expresiones lambda hemos dejado nuestro código anterior en solo esas lineas. Y por supuesto no es necesario tener la clase **usuarioListaRowMapper **

Lo que hemos hecho es cambiar la llamada a la función queryForObject por la llamada a la función query que esta definida de tal manera

<T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException;

Es decir espera una sentencia SQL y un clase que implemente la interfaz funcional RowMapper (que es una interfaz funcional esta explicado en la página anteriormente referenciada)

Pues bien, hemos creado esa clase a través de la expresión lambda, y nos hemos ahorrado un montón de código y dejado todo mucho más limpio.

Chicos, aprender a usar expresiones lambda. ¡¡ Mejoraran vuestro código !!