如何做功能组合?

2022-09-01 05:45:24

在不耐烦地等待Java 8发布并在阅读了Brian Goetz的精彩“Lambda状态”文章后,我注意到函数组合根本没有涵盖。

根据上面的文章,在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;

现在,如果我想编写这两个函数以具有映射到国家/地区的函数,那么如何在Java 8中实现这一点?Person


答案 1

有接口功能和:defaultFunction::andThenFunction::compose

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

答案 2

使用 和 时存在一个缺陷。您必须具有显式变量,因此不能使用如下方法引用:composeandThen

(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)

推荐