36

在相当不耐烦地等待 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;

现在,如果我想组合这两个函数来映射Person到国家/地区,我该如何在 Java 8 中实现呢?

4

2 回答 2

57

default接口函数Function::andThenFunction::compose

Function<Person, String> toCountry = personToAddress.andThen(addressToCountry);
于 2013-11-07T13:44:36.713 回答
22

compose使用and有一个缺陷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)
于 2015-09-29T08:09:14.377 回答