java - una - ¿Cómo hacer composición de funciones?
tipos de composicion en java (2)
Hay un error en el uso de compose
andThen
. Tienes que tener variables explícitas, por lo que no puedes usar referencias de métodos como esta:
(Person::getAddress).andThen(Address::getCountry)
No será compilado. ¡Qué pena!
Pero puedes definir una función de utilidad y usarla felizmente:
public static <A, B, C> Function<A, C> compose(Function<A, B> f1, Function<B, C> f2) {
return f1.andThen(f2);
}
compose(Person::getAddress, Address::getCountry)
Mientras esperaba con impaciencia el lanzamiento de Java 8 y después de leer el brillante artículo "State of the Lambda" de Brian Goetz noté que la composición de la función no estaba cubierta en absoluto.
Según el artículo anterior, en Java 8 debe ser posible:
// having classes Address and Person
public class Address {
private String country;
public String getCountry() {
return country;
}
}
public class Person {
private Address address;
public Address getAddress() {
return address;
}
}
// we should be able to reference their methods like
Function<Person, Address> personToAddress = Person::getAddress;
Function<Address, String> addressToCountry = Address::getCountry;
Ahora, si me gustaría componer estas dos funciones para tener una función mapeo de Person
a país, ¿cómo puedo lograr esto en Java 8?
Hay una función de interfaz predeterminada Function::andThen
and Function::andThen
y Function::compose
:
Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);