¿ Java Lambda vs reference method cual es mejor? . Cuando empezamos a trabajar con programación funcional rapidamente nos encontramos con situaciones en las que comparamos las expresiones lamdba con los métodos de referencia. ¿Cual es mejor mejor opción? . Vamos a construir un ejemplo que nos ayude a entenderlo de forma más sencilla . Para ello partiremos de la clase Persona:

Vamos a verlo en código:
package com.arquitecturajava.ejemplo1;
public class Persona {
private String nombre;
private int edad;
private double salario;
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
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, double salario) {
super();
this.nombre = nombre;
this.edad = edad;
this.salario = salario;
}
}
Esta clase dispone de la propiedad edad y la propiedad salario . Nosotros queremos construir un programa que nos permita calcular el salario final de las Personas que ya están jubiladas.

Se trata de un código relativamente rápido de construir a nivel de expresiones lambda.
package com.arquitecturajava.ejemplo1;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Principal {
public static void main(String[] args) {
Persona p1= new Persona("juan",50,1000);
Persona p2= new Persona("ana",70,1200);
Persona p3= new Persona("miguel",50,900);
Persona p4= new Persona("maria",80,2000);
List<Persona> lista= Arrays.asList(p1,p2,p3,p4);
List<Double> salariosJubilados=
lista.stream()
.filter(p->p.getEdad()>67)
.map(p->p.getSalario()*0.70)
.collect(Collectors.toList());
salariosJubilados.forEach(System.out::println);
}
}
En este caso filtramos la lista en un primer lugar para quedarnos con los jubilados para luego realizar una operación de transformación (map) que nos permita obtener el 70% del salario de la persona.

Con eso simplemente nos quedamos con una lista y la recorremos.

Java Lambda vs Reference Method
Hasta aquí todo parece perfecto , pero la realidad es que muchas de las operaciones que estamos usando son muy muy standard y se podrían reutilizar en otras áreas del programa estamos abriéndonos a la repetición de código en otras zonas. Por lo tanto puede ser interesante reestructurar el código para usar métodos de referencia.

package com.arquitecturajava.ejemplo2;
public class Persona {
private String nombre;
private int edad;
private double salario;
public double getSalario() {
return salario;
}
public void setSalario(double salario) {
this.salario = salario;
}
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, double salario) {
super();
this.nombre = nombre;
this.edad = edad;
this.salario = salario;
}
public boolean estaJubilado() {
return this.getEdad()>67);
}
}
La clase Persona contendrá el método que nos dice si una Persona esta jubilada y la clase CalculadoraJubilación nos indica que dinero debe recibir una vez jubilada.
package com.arquitecturajava.ejemplo2;
public class CalculadoraJubilacion {
public static double salarioFinal(double salario) {
return salario*0.70;
}
}
Una vez realizadas estas modificaciones podemos crear la nueva versión del programa.
package com.arquitecturajava.ejemplo2;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Principal {
public static void main(String[] args) {
Persona p1= new Persona("juan",50,1000);
Persona p2= new Persona("ana",70,1200);
Persona p3= new Persona("miguel",50,900);
Persona p4= new Persona("maria",80,2000);
List<Persona> lista= Arrays.asList(p1,p2,p3,p4);
List<Double> salariosJubilados=lista.stream()
.filter(Persona::estaJubilado)
.map(Persona::getSalario)
.map(CalculadoraJubilacion::salarioFinal)
.collect(Collectors.toList());
salariosJubilados.forEach(System.out::println);
}
}
En ella nos apoyamos en el método estaJubilado, getSalario y salarioFinal para realizar la misma operación . El código queda algo más amplio pero hemos ubicado las responsabilidades en las clases correctas e incrementado el nivel de reutilización. La mayor parte de las veces a la hora de tomar la decisión entre Java Lambdas vs reference methods es mejor usar estos últimos.
Tengo el objeto newRecibo del tipo entidad RECIBO, la cual consta de n campos. En la pantalla de captura de datos se completan todos los campos excepto 2 de ellos los cuales son el ID y SERIE.
El registro con la misma información, deberá ser insertado 14 veces a la tabla, variando únicamente los 2 campos antes mencionados, los cuales durante el proceso de insertar les serán calculados y asignados sus valores.
Lo anterior es para tener un contexto para mi pregunta, la cual es:
¿Sería la forma más idónea para realizar dicha inserción el proceso que ilustro a continuación?
RECIBO reciboTmp = new RECIBO;
for (int i=1; i<= 14; i++){
reciboTmp = newRecibo.clone();
reciboTmp.ID = this.generarId();
reciboTmp.SERIE= this.generarSerie();
/* Proceso de insertar el registro en tabla */
}
/* Fin del proceso */
Desde ya agradezco tu valiosa opinión y espero haberme dado a entender.
Saludos.
Buenas, más allá de la explicación que está muy bien creo que se podría mejorar el código de la funcón esJubilado simplemente retornando ‘this.getEdad() > 67’
Saludos!
Me lo apunto gracias 🙂