While rather impatiently waiting for Java 8 release and after reading brilliant 'State of the Lambda' article from Brian Goetz I noticed that function composition was not covered at all.
As per above article, in Java 8 the following should be possible:
// 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;
Now if I would like to compose these two functions to have a function mapping Person
to country, how can I achieve this in Java 8?
In mathematics, function composition is an operation ∘ that takes two functions f and g, and produces a function h = g ∘ f such that h(x) = g(f(x)). In this operation, the function g is applied to the result of applying the function f to x.
There are default
interface functions Function::andThen
and Function::compose
:
Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);
There is one flaw in using compose
and andThen
. You have to have explicit variables, so you can't use method references like this:
(Person::getAddress).andThen(Address::getCountry)
It won't be compiled. What a pity!
But you can define an utility function and use it happily:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With