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:
- Referencia a métodos estáticos
- Referencia a métodos de instancia de un objeto
- Referencia a métodos de instancia de un objeto para un tipo en particular
- 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