¿Qué es la programacion Imperativa? . Todos estamos habituados a programar y cuando lo hacemos habitualmente usamos un enfoque imperativo. ¿Qué quiere decir esto? , pues simplemente que le decimos al lenguaje de programación como tiene que realizar cada uno de los pasos .Le decimos que variables usar, que bucles y sentencias etc. Es decir construimos un algoritmo muy concreto para solventar un problema. Vamos a ver un ejemplo con una lista de Personas:
package com.arquitecturajava; public class Persona { private String nombre; private int edad; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } public Persona(String nombre, int edad) { super(); this.nombre = nombre; this.edad = edad; } }
Programacion Imperativa
Vamos a crear un programa que nos imprima la media de edad de las personas mayores de 18 años . Para ello vamos a usar un enfoque de programacion imperativa.
package com.arquitecturajava; import java.util.ArrayList; import java.util.List; public class Principal { public static void main(String[] args) { Persona p1= new Persona("pepe",20); Persona p2= new Persona("juan",12); Persona p3= new Persona("angela",30); Persona p4= new Persona("gema",40); Persona p5= new Persona("david",15); List<Persona> lista=new ArrayList<Persona>(); lista.add(p1); lista.add(p2); lista.add(p3); lista.add(p4); lista.add(p5); int totalEdad=0; int totalPersonas=0; for (Persona p: lista) { if (p.getEdad()>=18) { totalEdad+=p.getEdad(); totalPersonas++; } } System.out.println(totalEdad/totalPersonas); } }
En este caso hemos declarado dos variables que hacen de acumuladores y utilizado un bucle for y una sentencia if. El programa imprime un resultado.
Sin embargo hoy en día esta opción ya no es la mejor opción . Vamos a realizar la misma operativa con programación declarativa.
package com.arquitecturajava; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.OptionalDouble; public class Principal2 { public static void main(String[] args) { Persona p1= new Persona("pepe",20); Persona p2= new Persona("juan",12); Persona p3= new Persona("angela",30); Persona p4= new Persona("gema",40); Persona p5= new Persona("david",15); List<Persona> lista=new ArrayList<Persona>(); lista.add(p1); lista.add(p2); lista.add(p3); lista.add(p4); lista.add(p5); OptionalDouble resultado=lista.stream().filter(persona->persona.getEdad()>=18) .mapToInt(persona->persona.getEdad()) .average(); if(resultado.isPresent()) { System.out.println(resultado.getAsDouble()); } } }
En este caso hemos solicitado al programa que realice una serie de tareas apoyándonos en programación funcional “el enfoque ha sido declarativo”.
Hemos declarado de forma abstracta las tareas a realizar y el lenguaje se ha encargado de los detalles. En este caso hemos utilizado expresiones Lambda. El resultado es idéntico.
La programación declarativa nos permite crear programas más compactos , reutilizables y thread safe , poco a poco nos iremos acostumbrando a ella en el mundo Java.
Otros artículos relacionados : Java Lambda , Java Streams , Java WorkFlows
Gracias por tu articulo.
Me confunde el hecho de que no veo mucha diferencia.
Encuentro que eso se logra apoyandose en funciones que el propio java te facilita.
quiero decir: Esa funciona average() , por ej, en el fondo supongo que esta haciendo lo mismo que uno haria.
Solo estas delegando mas tareas en el propio lenguaje.
Me encuentro confundido. jaja
Saludos
Si pero es mucho más sencillo añadir operaciones adicional en la programación declarativa que en un bucle for
Muy buen articulo
gracias 🙂
No todo es color de Rosa, la programacion declarativa ha sido fuertemente impulsada por Python, Matlab entre otros lenguajes.
El problema radica cuando quieres algo mas especifico (no comun). Ahi nuevamente tienes que programar imperativamente.
Saludos.
gracias por el aporte 🙂
un dolor de cabeza con las expresiones Lambda
La verdad es que cuesta adaptarse 🙂
Si, hay que ir acostumbrándose a java8 y las nuevas cosas que trae. Yo personalmente soy un paquete aún con estos temas. Hace poco que empecé a leerte y ya vuelvo cada poco a ver qué vas publicando. Buen artículo.
gracias 🙂
Casualmente estoy estudiando esto para obtener el OCP y una ayudita extra siempre es de agradecer, gracias por el artículo.
De nada 🙂
Me parece muy bueno el articulo, si el futuro es la programacion declarativa a donde nos lleva este paradigma de programacion? y como sera la manera de pensar de los que cambien a el mismo?
pues tendremos que irlo viendo 🙂