Usando Lambdas August 23, 2018

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 !!