Подтвердить что ты не робот

Как выполнять функцию композиции?

В то время как довольно нетерпеливо ждет выпуск Java 8 и после чтения блестящей статьи "Состояние лямбды" от Брайана Гетца, я заметил, что состав функции не был вообще включен.

Как указано выше, в Java 8 должно быть возможно следующее:

// 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;

Теперь, если я хотел бы скомпоновать эти две функции для отображения функции Person в страну, как я могу достичь этого в Java 8?

4b9b3361

Ответ 1

Существует функция интерфейса по умолчанию Function::andThen и Function::compose:

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

Ответ 2

Существует один недостаток использования compose и andThen. У вас должны быть явные переменные, поэтому вы не можете использовать ссылки на методы, например:

(Person::getAddress).andThen(Address::getCountry)

Он не будет скомпилирован. Какая жалость!

Но вы можете определить функцию утилиты и использовать ее счастливо:

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)