Java 8 Reference method

Puedes utilizar lambda para crear métodos anónimos, pero hay casos en el que estas expresiones lambda no hacen otra cosa más que llamar a otro método.

En estos casos resulta más claro llamar al método directamente por su nombre.

Si tienes una lista de personas de este modo y quieres ordenarla harías algo así de forma habitual con Java:

// Without lambda expression
Collections.sort(personList, new Comparator<Person>() {
   @Override
   public int compare(Person a, Person b) {
       return a.getBirthday().compareTo(b.getBirthday());
   }
});

Con lambda expressions puedes hacerlo aún mejor:

// With lambda expression
Collections.sort(personList,
       (Person a, Person b) -> {
           return a.getBirthday().compareTo(b.getBirthday());
       }
);

Observa la expresión lambda anterior. Lo que hace es en definitiva devolver un un int, si quisieras podrías llevarla a un método ‘compareByAge’ que haga lo mismo retornando el int con el resultado de la comparación, de este modo

public class Person {

public enum Sex {
   MALE, FEMALE
}

private String name;
private LocalDate birthday;
private Sex gender;
private String emailAddress;

// static method for lambda method reference example
public static int compareByAge(Person a, Person b) {
   return a.birthday.compareTo(b.birthday);
}

}

Este método puedes usarlo así directamente aprovechando “Method References” de Java 8.

Lo que haces en definitiva es pasar el método a ser ejecutado como argumento

// With method reference
Collections.sort(personList, Person::compareByAge);

Cómo usar la referencia a métodos en Java 8

Existen varias formas de llamar a métodos por referencias:

  1. Referencia a métodos estáticos
  2. Referencia a métodos de instancia de un objeto
  3. Referencia a métodos de instancia de un objeto para un tipo en particular
  4. Referencias a un constructor
// 1-With method reference
Collections.sort(personList, Person::compareByAge);
// --

// 2-Reference to a static method
personList.forEach(System.out::println);
// --

// 3-Reference to an instance method of a particular object
class ComparisonProvider {
   public int compareByName(Person a, Person b) {
       return a.getName().compareTo(b.getName());
   }

   public int compareByAge(Person a, Person b) {
       return a.getBirthday().compareTo(b.getBirthday());
   }
}
ComparisonProvider myComparisonProvider = new ComparisonProvider();

personList.sort(myComparisonProvider::compareByAge);
// --

// 4-Reference to an instance method of an arbitrary object of a particular type
Collections.sort(personList, Person::compareByAge);
// --

// 5-Reference to a constructor

// Using a lambda expression
Supplier<Person> personSupplier2 = () -> new Person();
Person personFromSupplier2 = personSupplier2.get();

// Using a method reference
Supplier<Person> p = Person::new;
Person onePerson = p.get();

..

Referencias:
[https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html]2

Hi! If you find my posts helpful, please support me by inviting me for a coffee :)

Ver también