Ответ 1
Существует функция интерфейса по умолчанию Function::andThen
и Function::compose
:
Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);
В то время как довольно нетерпеливо ждет выпуск 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?
Существует функция интерфейса по умолчанию Function::andThen
и Function::compose
:
Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);
Существует один недостаток использования 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)