Java Lambda vs reference method y reutilización

¿ 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.

Otros artículos relacionados