How to do function composition?

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?


Solution 1:

There are default interface functions Function::andThen and Function::compose:

Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);

Solution 2:

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)