java8:来自另一个方法引用的方法引用

时间:2016-03-24 16:58:48

标签: java lambda java-8

我想使用基于另一个方法引用的方法引用。这很难解释,所以我给你举个例子:

Person.java

putRoot

鉴于mapRoot的列表,我想使用方法引用来获取其兄弟年龄的列表。我知道这可以这样做:

public class Person{
    Person sibling;
    int age;

    public Person(int age){
        this.age = age;
    }

    public void setSibling(Person p){
        this.sibling = p;
    }

    public Person getSibling(){
        return sibling;
    }

    public int getAge(){
        return age;
    }
}

但我想知道是否可以这样做:

Person

在这个例子中它并不是非常有用,我只是想知道可能的事情。

3 个答案:

答案 0 :(得分:13)

在这种情况下,您需要使用两个map操作:

roster.stream().map(Person::getSibling).map(Person::getAge).collect(Collectors.toList());

第一个将Person映射到其兄弟,第二个将Person映射到其年龄。

答案 1 :(得分:2)

您可以使用Eclipse Collections中的Functions.chain()来链接方法引用:

MutableList<Person> roster = Lists.mutable.empty();
MutableList<Integer> ages = 
    roster.collect(Functions.chain(Person::getSibling, Person::getAge));

如果您无法从List

更改名单
List<Person> roster = Lists.mutable.empty();
List<Integer> ages =
    ListAdapter.adapt(roster).collect(Functions.chain(Person::getSibling, Person::getAge));

由于年龄为int,您可以使用IntList来避免拳击:

MutableList<Person> roster = Lists.mutable.empty();
IntList ages = roster.collectInt(Functions.chainInt(Person::getSibling, Person::getAge));

注意:我是Eclipse Collections的撰稿人。

答案 2 :(得分:1)

使用Function.andThen,并可能在调用中包装您的第一个方法引用,或者转换。

public static <V, R> Function<V,R> ofFunction(Function<V,R> function) {
    return function;
}

roster.collect(ofFunction(Person::getSibling).andThen(Person::getAge));