Java 8 Reference method

By | 04/18/2017

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 cuatro 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
4- Referencia a métodos de instancia de un objeto para un tipo en particular
5- 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

Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *